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 项目需求
开发一个自动识别验证码的脚本,能够:
- 截取验证码图片
- 进行图像预处理
- 调用 OCR 识别
- 自动填写验证码
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 项目需求
开发一个智能找色点击工具,能够:
- 识别指定颜色区域
- 自动点击目标位置
- 支持颜色容差
- 支持区域限制
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,及时释放资源 |
| 识别结果格式问题 | 统一结果格式,增加结果验证 |
七、性能优化建议
- 合理设置识别区域,避免全屏识别
- 使用图像缓存,减少重复截图
- 优化图像预处理参数,提高识别率
- 使用异步处理,避免阻塞主线程
- 及时释放图像资源,避免内存泄漏
- 使用多线程处理大量图像
- 优化颜色匹配算法,提高准确率
- 使用模板缓存,提高匹配效率
- 控制并发数量,避免资源竞争
- 优化特征点检测参数,提高准确率
- 使用图像压缩,减少内存占用
- 优化识别参数,提高识别速度
- 使用结果缓存,避免重复识别
- 优化异常处理,提高稳定性
- 使用性能监控,及时发现问题
最后感谢阅读!欢迎关注我,微信公众号:
《鲫小鱼不正经》。欢迎点赞、收藏、关注,一键三连!!!