简介:本文深入解析AutoJS官方文档中的OCR功能,从基础原理到实战应用,系统讲解如何通过AutoJS实现图片文字识别及截图文字提取,提供可操作的代码示例与优化建议。
AutoJS作为一款基于JavaScript的自动化工具,其OCR(Optical Character Recognition,光学字符识别)功能通过集成第三方识别引擎(如Tesseract、PaddleOCR等),实现了对图片中文字的高效提取。该功能的核心原理包括图像预处理、特征提取、字符匹配三个阶段:
AutoJS的OCR功能支持两种主要场景:静态图片识别(如本地图片文件)和动态截图识别(如实时屏幕内容)。后者在自动化测试、数据抓取等场景中具有独特优势。
使用AutoJS进行OCR前,需确保设备已安装以下组件:
安装步骤示例(以Tesseract为例):
// 通过AutoJS的shell命令安装Tesseractshell("apk add tesseract-ocr", true);shell("apk add tesseract-ocr-data-chi_sim", true); // 中文简体数据包
静态图片识别的核心代码结构如下:
function recognizeImage(imagePath) {let img = images.read(imagePath);if (!img) {console.error("图片加载失败");return;}// 图像预处理:灰度化+二值化let grayImg = images.grayscale(img);let binaryImg = images.threshold(grayImg, 128, 255, "binary");// 调用OCR引擎(以Tesseract为例)let tempPath = "/sdcard/temp_ocr.png";images.save(binaryImg, tempPath);let result = shell("tesseract " + tempPath + " stdout -l chi_sim", true);console.log("识别结果:", result);// 清理临时文件files.remove(tempPath);}// 调用示例recognizeImage("/sdcard/test.png");
关键参数说明:
-l chi_sim:指定中文简体语言包threshold:二值化阈值(0-255),需根据图片对比度调整images.clip():可裁剪图片区域,减少无关内容干扰eng、jpn)并通过-l参数指定典型错误处理:
try {recognizeImage("/sdcard/test.png");} catch (e) {console.error("OCR失败:", e);// 回退方案:调用备用OCR服务}
动态识别的核心在于精准获取目标区域截图:
// 全屏截图let fullScreen = images.captureScreen();// 区域截图(示例:坐标[100,200]到[300,400])let region = images.clip(fullScreen, 100, 200, 200, 200);// 保存截图用于调试images.save(region, "/sdcard/region.png");
高级技巧:
images.findImage()定位固定布局的按钮/文字区域images.findColor()定位特定颜色文字结合截图与OCR的完整流程示例:
function recognizeScreenText(x, y, width, height) {let screen = images.captureScreen();let target = images.clip(screen, x, y, width, height);// 预处理:去噪+增强对比度let processed = images.convolve(target, [[-1, -1, -1],[-1, 9, -1],[-1, -1, -1]]);// 调用OCR(此处模拟API调用)let text = callOCRService(processed); // 需替换为实际OCR接口// 结果校验(正则匹配)if (/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/.test(text)) {console.log("识别到日期:", text);}return text;}
threads.start()避免阻塞主线程
threads.start(function() {let result = recognizeScreenText(100, 100, 200, 50);ui.run(() => {toast("识别结果:" + result);});});
结合AutoJS的任务调度功能实现批量识别:
// 遍历文件夹中的所有图片let files = file.listDir("/sdcard/ocr_images/");files.forEach(file => {if (file.endsWith(".png")) {let text = recognizeImage("/sdcard/ocr_images/" + file);file.writeText(text); // 将结果写入同名txt文件}});
let rawText = "联系电话:13812345678";let phone = rawText.match(/1[3-9]\d{9}/)[0];console.log("提取到电话:" + phone);
let structured = {"date": rawText.match(/\d{4}-\d{2}-\d{2}/)[0],"amount": parseFloat(rawText.match(/金额:(\d+\.\d+)/)[1])};
device.sdkInt判断系统版本| 问题类型 | 典型表现 | 解决方案 |
|---|---|---|
| 识别乱码 | 中文显示为方框 | 检查语言包是否安装,调整-l参数 |
| 速度过慢 | 单张图片识别>5秒 | 降低图片分辨率,使用轻量级模型 |
| 区域错位 | 识别内容与截图不符 | 校验坐标计算逻辑,增加调试日志 |
| 内存溢出 | 连续识别时崩溃 | 及时释放图片对象,增加GC调用 |
AutoJS的OCR功能通过灵活的接口设计和强大的扩展能力,为自动化测试、数据采集等场景提供了高效解决方案。未来可期待: