logo

Auto.js进阶实战:OCR与图色分析全攻略

作者:宇宙中心我曹县2025.09.26 19:54浏览量:0

简介:本文详解Auto.js中OCR识别与图色分析技术,通过代码示例与实战技巧,助力开发者高效实现屏幕文字提取与图像分析,提升自动化脚本实用性。

Auto.js进阶实战:OCR识别与图色分析全攻略

在Auto.js自动化脚本开发中,OCR(光学字符识别)与图色分析是两项核心技能,尤其适用于需要处理屏幕文字或图像匹配的场景。本文将系统讲解这两项技术的实现原理、代码实践及优化策略,帮助开发者突破自动化瓶颈。

一、OCR识别:从屏幕提取文字的魔法

1.1 OCR技术原理与Auto.js实现

OCR的核心是通过图像处理算法识别文字区域,再结合机器学习模型解析字符。Auto.js通过images.findImage()定位文字区域后,需调用外部OCR引擎(如Tesseract)完成识别。

代码示例:基础OCR识别

  1. // 安装Tesseract OCR引擎(需提前配置环境)
  2. const ocr = require("tesseract.js");
  3. // 截取屏幕指定区域
  4. let img = captureScreen();
  5. let textRegion = images.findImage(img, {template: "文字模板.png"});
  6. // 裁剪文字区域
  7. let textImg = images.clip(img, textRegion.x, textRegion.y, textRegion.width, textRegion.height);
  8. // 调用OCR识别(需将图片转为Base64)
  9. ocr.recognize(
  10. images.toBase64(textImg),
  11. 'eng', // 语言包
  12. {logger: m => console.log(m)}
  13. ).then(({data: {text}}) => {
  14. console.log("识别结果:", text);
  15. });

关键点

  • 需提前下载Tesseract语言包(如eng.traineddata
  • 文字模板匹配可提升定位精度
  • 复杂背景需先进行二值化处理

1.2 实战优化技巧

场景1:验证码识别

  1. // 预处理:灰度化+二值化
  2. let grayImg = images.grayscale(textImg);
  3. let binaryImg = images.threshold(grayImg, 128); // 阈值可根据实际调整
  4. // 调用OCR
  5. ocr.recognize(images.toBase64(binaryImg), 'eng').then(...)

场景2:多语言支持

  • 下载对应语言包(如chi_sim.traineddata中文)
  • 修改识别参数:
    1. ocr.recognize(imgBase64, 'chi_sim+eng') // 中英混合识别

二、图色分析:精准定位屏幕元素

2.1 基础图色匹配原理

图色分析通过像素颜色值匹配实现元素定位,Auto.js提供images.findColor()images.findImage()两种核心方法。

代码示例:颜色点匹配

  1. // 在屏幕(100,100)到(500,500)区域内寻找红色像素
  2. let point = images.findColor(captureScreen(), "#FF0000", {
  3. region: [100, 100, 400, 400],
  4. threshold: 4 // 颜色容差
  5. });
  6. if (point) {
  7. console.log("找到红色点:", point.x, point.y);
  8. }

代码示例:模板图片匹配

  1. // 加载模板图片(需提前截图保存)
  2. let template = images.read("/sdcard/template.png");
  3. // 在屏幕中搜索
  4. let result = images.findImage(captureScreen(), template, {
  5. threshold: 0.8 // 相似度阈值
  6. });
  7. if (result) {
  8. console.log("模板匹配成功:", result);
  9. }

2.2 高级匹配策略

策略1:多模板组合匹配

  1. let templates = ["btn_ok.png", "btn_cancel.png"];
  2. let found = null;
  3. for (let tpl of templates) {
  4. let img = images.read("/sdcard/" + tpl);
  5. let res = images.findImage(captureScreen(), img, {threshold: 0.85});
  6. if (res) {
  7. found = {pos: res, name: tpl.replace(".png", "")};
  8. break;
  9. }
  10. }

策略2:动态阈值调整

  1. function adaptiveFindImage(screen, template, minThreshold = 0.7, maxThreshold = 0.95, step = 0.05) {
  2. for (let t = maxThreshold; t >= minThreshold; t -= step) {
  3. let res = images.findImage(screen, template, {threshold: t});
  4. if (res) return res;
  5. }
  6. return null;
  7. }

三、性能优化与异常处理

3.1 效率提升方案

  1. 区域限制:缩小搜索范围
    1. let partialScreen = images.clip(captureScreen(), 0, 0, 800, 1280); // 只处理上半屏
  2. 降采样处理:对大图进行缩放
    1. let smallImg = images.resize(captureScreen(), 0.5); // 缩小为50%
  3. 缓存机制:重复使用的模板只加载一次
    1. const TEMPLATES = {};
    2. function getTemplate(path) {
    3. if (!TEMPLATES[path]) {
    4. TEMPLATES[path] = images.read(path);
    5. }
    6. return TEMPLATES[path];
    7. }

3.2 异常处理框架

  1. function safeOcr(imgPath, lang = 'eng') {
  2. try {
  3. let img = images.read(imgPath);
  4. if (!img) throw new Error("图片加载失败");
  5. return ocr.recognize(images.toBase64(img), lang)
  6. .then(({data}) => data.text)
  7. .catch(e => {
  8. console.error("OCR识别错误:", e);
  9. return null;
  10. });
  11. } catch (e) {
  12. console.error("预处理错误:", e);
  13. return Promise.resolve(null);
  14. }
  15. }

四、实战案例:自动登录脚本

需求:识别验证码并自动填写登录表单

  1. // 主流程
  2. auto.waitFor();
  3. let window = captureScreen();
  4. // 1. 定位用户名输入框
  5. let userField = images.findImage(window, images.read("/sdcard/user_field.png"), {threshold: 0.8});
  6. if (!userField) throw "无法定位用户名框";
  7. // 2. 定位验证码图片
  8. let captchaImgPos = images.findImage(window, images.read("/sdcard/captcha.png"), {threshold: 0.85});
  9. if (!captchaImgPos) throw "无法定位验证码";
  10. // 3. 截取验证码区域
  11. let captchaRegion = {
  12. x: captchaImgPos.x,
  13. y: captchaImgPos.y,
  14. width: 120, // 根据实际调整
  15. height: 40
  16. };
  17. let captchaImg = images.clip(window, ...Object.values(captchaRegion));
  18. // 4. OCR识别验证码
  19. safeOcr(images.toBase64(captchaImg))
  20. .then(text => {
  21. if (!text || text.length < 4) throw "验证码识别失败";
  22. // 5. 填写表单
  23. click(userField.x + 50, userField.y + 10);
  24. setText("my_username");
  25. click(captchaImgPos.x + 60, captchaImgPos.y + 20);
  26. setText(text.trim());
  27. // 6. 点击登录按钮
  28. click(800, 500); // 根据实际坐标调整
  29. })
  30. .catch(console.error);

五、常见问题解决方案

  1. OCR识别率低

    • 增加预处理步骤(去噪、锐化)
    • 调整二值化阈值
    • 使用更精准的语言包
  2. 图色匹配失败

    • 检查模板图片是否与屏幕分辨率匹配
    • 尝试降低threshold值(0.7~0.9为宜)
    • 使用images.findColor()辅助定位
  3. 性能瓶颈

    • 避免在主线程执行耗时操作
    • 使用setTimeoutPromise分解任务
    • 对固定元素使用缓存机制

通过系统掌握OCR识别与图色分析技术,开发者可以突破Auto.js自动化脚本的功能边界,实现更复杂的业务场景覆盖。建议从简单案例入手,逐步积累模板库和预处理经验,最终构建出稳定高效的自动化解决方案。

相关文章推荐

发表评论

活动