Auto.js 入门指南(十一)OCR 识别与图色分析

998 阅读7分钟

OCR 识别与图色分析

前言

大家好,我是鲫小鱼。是一名不写前端代码的前端工程师,热衷于分享非前端的知识,带领切图仔逃离切图圈子,欢迎关注我,微信公众号:《鲫小鱼不正经》。欢迎点赞、收藏、关注,一键三连!!


一、理论讲解:OCR 与图色分析基础

在 Auto.js 自动化脚本开发中,OCR(光学字符识别)和图色分析是两个强大的功能模块。它们让脚本具备了"眼睛"和"大脑",能够识别屏幕上的文字和图像,实现更智能的自动化操作。

1.1 OCR 技术原理

  • 图像预处理:灰度化、二值化、去噪等
  • 文字定位:检测文字区域
  • 字符分割:将文字分割成单个字符
  • 特征提取:提取字符特征
  • 字符识别:将特征匹配到字符库

1.2 图色分析应用场景

  • 颜色匹配:识别特定颜色区域
  • 图像对比:判断图像相似度
  • 特征点检测:识别图像特征点
  • 模板匹配:查找目标图像位置
  • 边缘检测:识别图像边界

类比理解:OCR 就像"眼睛",图色分析就像"大脑",二者结合让你的脚本更智能。


二、基础与进阶代码示例

2.1 OCR 基础使用

// 初始化 OCR
let ocr = new OCR();
// 识别屏幕文字
let result = ocr.recognize(captureScreen());
console.log("识别结果:", result);

2.2 区域 OCR 识别

// 指定区域识别
let img = captureScreen();
let region = [100, 200, 300, 400]; // x, y, width, height
let result = ocr.recognize(img, region);

2.3 颜色识别

// 获取指定坐标颜色
let color = images.pixel(captureScreen(), 100, 200);
console.log("RGB值:", colors.red(color), colors.green(color), colors.blue(color));

2.4 图像相似度比较

// 比较两张图片相似度
let img1 = captureScreen();
let img2 = images.read("/sdcard/template.png");
let similarity = images.similar(img1, img2);
console.log("相似度:", similarity);

2.5 模板匹配

// 在屏幕中查找目标图像
let screen = captureScreen();
let template = images.read("/sdcard/template.png");
let point = findImage(screen, template);
if (point) {
    console.log("找到目标,坐标:", point);
}

2.6 边缘检测

// 检测图像边缘
let img = captureScreen();
let edges = images.canny(img, 50, 150);
images.save(edges, "/sdcard/edges.png");

2.7 特征点检测

// 检测图像特征点
let img = captureScreen();
let keypoints = images.findKeypoints(img);
console.log("特征点数量:", keypoints.length);

2.8 图像预处理

// 图像预处理
let img = captureScreen();
// 灰度化
let gray = images.grayscale(img);
// 二值化
let binary = images.threshold(gray, 127, 255, "BINARY");
// 保存处理后的图像
images.save(binary, "/sdcard/processed.png");

三、实战项目1:自动识别验证码

3.1 项目需求

开发一个自动识别验证码的脚本,能够:

  1. 截取验证码图片
  2. 进行图像预处理
  3. 调用 OCR 识别
  4. 自动填写验证码

3.2 项目源码

// verify_code.js
"ui";
ui.layout(
    <vertical>
        <button id="start" text="开始识别"/>
        <text id="result" text="识别结果:"/>
        <img id="preview" w="200" h="80"/>
    </vertical>
);

// 图像预处理函数
function preprocessImage(img) {
    // 灰度化
    let gray = images.grayscale(img);
    // 二值化
    let binary = images.threshold(gray, 127, 255, "BINARY");
    // 降噪
    let denoised = images.medianBlur(binary, 3);
    return denoised;
}

// OCR 识别函数
function recognizeCode(img) {
    let ocr = new OCR();
    let result = ocr.recognize(img);
    return result;
}

ui.start.on("click", () => {
    // 截取验证码区域
    let img = captureScreen();
    let region = [100, 200, 200, 80]; // 根据实际验证码位置调整
    let codeImg = images.clip(img, region[0], region[1], region[2], region[3]);

    // 预处理
    let processed = preprocessImage(codeImg);

    // 显示预览
    ui.run(() => {
        ui.preview.setImageBitmap(processed);
    });

    // 识别
    let result = recognizeCode(processed);

    // 显示结果
    ui.run(() => {
        ui.result.setText("识别结果:" + result);
    });

    // 自动填写
    if (result) {
        setText(result);
    }
});

3.3 运行效果

  • 点击按钮自动截取验证码
  • 显示预处理后的图像
  • 显示识别结果
  • 自动填写验证码

四、实战项目2:智能找色点击

4.1 项目需求

开发一个智能找色点击工具,能够:

  1. 识别指定颜色区域
  2. 自动点击目标位置
  3. 支持颜色容差
  4. 支持区域限制

4.2 项目结构

autojs-color-finder/
├── main.js
├── modules/
│   └── colorFinder.js
└── README.md

4.3 colorFinder.js 代码

// modules/colorFinder.js
function findColor(img, targetColor, options = {}) {
    let {
        threshold = 10,
        region = null,
        maxPoints = 1
    } = options;

    let points = [];
    let width = img.getWidth();
    let height = img.getHeight();

    // 如果指定了区域,则只在该区域内查找
    let startX = region ? region[0] : 0;
    let startY = region ? region[1] : 0;
    let endX = region ? region[0] + region[2] : width;
    let endY = region ? region[1] + region[3] : height;

    for (let x = startX; x < endX; x++) {
        for (let y = startY; y < endY; y++) {
            let color = images.pixel(img, x, y);
            if (colors.isSimilar(color, targetColor, threshold)) {
                points.push([x, y]);
                if (points.length >= maxPoints) {
                    break;
                }
            }
        }
    }

    return points;
}

module.exports = { findColor };

4.4 main.js 代码

"ui";
const colorFinder = require("./modules/colorFinder.js");

ui.layout(
    <vertical>
        <button id="start" text="开始找色"/>
        <text id="status" text="状态:就绪"/>
        <text id="result" text="找到的点:"/>
    </vertical>
);

ui.start.on("click", () => {
    // 目标颜色(红色)
    let targetColor = colors.parseColor("#FF0000");

    // 截取屏幕
    let img = captureScreen();

    // 查找颜色
    let points = colorFinder.findColor(img, targetColor, {
        threshold: 10,
        region: [100, 200, 300, 400],
        maxPoints: 5
    });

    // 显示结果
    ui.run(() => {
        ui.status.setText("状态:找到 " + points.length + " 个点");
        ui.result.setText("找到的点:" + JSON.stringify(points));
    });

    // 点击第一个点
    if (points.length > 0) {
        click(points[0][0], points[0][1]);
    }
});

4.5 运行效果

  • 点击按钮开始找色
  • 显示找到的颜色点数量
  • 显示具体坐标
  • 自动点击第一个点

五、分步详解与进阶技巧

5.1 OCR 优化技巧

  • 图像预处理对识别率影响很大
  • 合理设置识别区域提高效率
  • 多语言支持需要额外配置
  • 识别结果后处理提高准确率

5.2 图色分析优化

  • 颜色容差设置要合理
  • 区域限制提高查找效率
  • 多线程处理大量图像
  • 缓存常用图像模板

5.3 性能优化

  • 减少不必要的截图
  • 合理设置识别区域
  • 使用图像缓存
  • 异步处理耗时操作

5.4 移动端适配

  • 考虑不同分辨率
  • 处理屏幕旋转
  • 适配不同设备
  • 处理权限问题

5.5 异常处理

  • 识别失败重试
  • 图像加载异常
  • 权限问题处理
  • 内存溢出处理

5.6 实用技巧

  • 图像预处理参数调优
  • 颜色匹配算法选择
  • 模板匹配优化
  • 特征点检测应用

5.7 调试技巧

  • 保存中间图像
  • 记录识别过程
  • 分析失败原因
  • 优化识别参数

5.8 安全考虑

  • 敏感信息处理
  • 图像数据加密
  • 权限管理
  • 资源释放

六、常见问题与解决方案

问题解决方案
OCR 识别率低优化图像预处理,调整识别参数
颜色匹配不准确调整颜色容差,考虑光照影响
识别速度慢缩小识别区域,使用图像缓存
内存占用过大及时释放图像资源,控制并发数量
识别结果不稳定增加重试机制,结果后处理
模板匹配失败更新模板图像,调整匹配参数
特征点检测不准确调整检测参数,优化图像质量
图像处理卡顿使用异步处理,优化处理算法
权限问题检查存储权限,处理运行时权限
设备兼容性问题适配不同分辨率,处理屏幕旋转
识别超时设置超时机制,异常重试
图像质量差优化截图参数,图像预处理
并发处理冲突使用锁机制,控制并发数量
资源释放不及时使用 try-finally,及时释放资源
识别结果格式问题统一结果格式,增加结果验证

七、性能优化建议

  • 合理设置识别区域,避免全屏识别
  • 使用图像缓存,减少重复截图
  • 优化图像预处理参数,提高识别率
  • 使用异步处理,避免阻塞主线程
  • 及时释放图像资源,避免内存泄漏
  • 使用多线程处理大量图像
  • 优化颜色匹配算法,提高准确率
  • 使用模板缓存,提高匹配效率
  • 控制并发数量,避免资源竞争
  • 优化特征点检测参数,提高准确率
  • 使用图像压缩,减少内存占用
  • 优化识别参数,提高识别速度
  • 使用结果缓存,避免重复识别
  • 优化异常处理,提高稳定性
  • 使用性能监控,及时发现问题

最后感谢阅读!欢迎关注我,微信公众号:《鲫小鱼不正经》。欢迎点赞、收藏、关注,一键三连!!!