跳至主要內容

ocr - 文字识别

约 1548 字大约 5 分钟道无涯

Pro 9.2版本新增

$ocr模块即光学文字识别,用于识别图片中的文字。该内置模块基于PaddleOCR实现,需要先在Auto.js Pro的插件商店中下载官方PaddleOCR插件才能使用。打包时插件可一并打包到apk中,无需单独安装插件。

另外,官方提供了另一个基于谷歌MLKit的OCR插件,参见官方MLKitOCR插件

插件下载

蓝奏云下载:
https://wwi.lanzoup.com/i7or017t0rsdopen in new window

提示

特别感谢Auto.js爱好者L(QQ: 2056968162,7Zip插件作者)提供的初始对接代码,并在后续提供了一些Bug修复和优化的帮助,大大节省了开发时间❤️。

$ocr.create([options])

  • options {object} 可选参数,选项option包括以下内容:

    • models {string} 模型,slim指定精度相对低但速度更快的模型,若不指定则为default模型,精度高一点但速度慢一点。也可直接指定自定义模型的绝对路径。

    • labelsFile {string} 模型的标签文件,默认为null,需要配合models字段使用。

    • cpuPowerMode {string} CPU模式,默认为

      • LITE_POWER_HIGH,可选值有:

      • LITE_POWER_HIGH 绑定大核运行模式。如果 ARM CPU 支持 big.LITTLE,则优先使用并绑定 Big cluster,如果设置的线程数大于大核数量,则会将线程数自动缩放到大核数量。如果系统不存在大核或者在一些手机的低电量情况下会出现绑核失败,如果失败则进入不绑核模式。

      • LITE_POWER_LOW 绑定小核运行模式。如果 ARM CPU 支持 big.LITTLE,则优先使用并绑定 Little cluster,如果设置的线程数大于小核数量,则会将线程数自动缩放到小核数量。如果找不到小核,则自动进入不绑核模式。

      • LITE_POWER_FULL 大小核混用模式。线程数可以大于大核数量,当线程数大于核心数量时,则会自动将线程数缩放到核心数量。

      • LITE_POWER_NO_BIND 不绑核运行模式(推荐)。系统根据负载自动调度任务到空闲的 CPU 核心上。

      • LITE_POWER_RAND_HIGH 轮流绑定大核模式。如果 Big cluster 有多个核心,则每预测10次后切换绑定到下一个核心。

      • LITE_POWER_RAND_LOW 轮流绑定小核模式。如果 Little cluster 有多个核心,则每预测10次后切换绑定到下一个核心。

    • parallelThreads {number} 并行线程数,默认为4

    • useOpenCL {boolean} 是否使用OpenCL,默认为false

  • 返回 {OCR} 返回新的OCR对象

根据给定选项,创建OCR对象,可用于文字识别。一般而已不必自定义参数,使用$ocr.create()即可创建有效的OCR对象。

一个简单的截图并识别文字例子如下:

// 创建OCR对象,需要先在Auto.js Pro的插件商店中下载官方PaddleOCR插件。
let ocr = $ocr.create({
    models: 'slim', // 指定精度相对低但速度更快的模型,若不指定则为default模型,精度高一点但速度慢一点
});

requestScreenCapture();

for (let i = 0; i < 5; i++) {
    let capture = captureScreen();

    // 检测截图文字并计算检测时间,首次检测的耗时比较长
    // 检测时间取决于图片大小、内容、文字数量
    // 可通过调整$ocr.create()的线程、CPU模式等参数调整检测效率
    let start = Date.now();
    let result = ocr.detect(capture);
    let end = Date.now();
    console.log(result);

    toastLog(`第$\{i + 1}次检测: ${end - start\}ms`);
    sleep(3000);
}

ocr.release();

有关资料参见PaddleOCR文档open in new window

OCR

$ocr.create()返回的对象,用于具体的文字识别。该对象不再需要时,需要调用release()函数释放资源。

OCR.detect(image[, options])

  • image {Image} 图片,要识别文字的图片。
  • options {object} 可选参数,选项options包括以下内容:
    • max {number} 识别文本的数量上限,默认为1000
    • detectRotation {boolean} 是否检测文字旋转,默认为false
    • region {Array} OCR识别区域。是一个两个或四个元素的数组。(region[0], region[1])表示区域的左上角;region[2]*region[3]表示区域的宽高。如果只有region只有两个元素,则区域为(region[0], region[1])到图片右下角。如果不指定region选项,则识别区域为整张图片。此选项为9.3版本新增。
  • 返回 {Array<OCRResult>} 文字识别结果的数组,包括可信度、文本内容、文本范围等

对给定图片根据给定选项进行文字识别,将文字识别的结果作为数组返回。

requestScreenCapture();
sleep(1000);

let ocr = $ocr.create();

let capture = captureScreen();
let result = ocr.detect(capture);
// 遍历结果,打印其文本
result.forEach(item => {
    console.log(item.text, item.confidence);
});
// 过滤可信度0.9以上的文本
let filtered = result.filter(item => item.confidence > 0.9);
// 模糊搜索文字内容为"Auto.js"的文本结果
let autojs = filtered.find(item => item.text.includes("编辑"));
console.log(autojs);
// 若搜索到则打印其可信度、范围和中点位置并点击
if (autojs) {
    console.log(`confidence = $\{autojs.confidence}, bounds = ${autojs.bounds}, center = (${autojs.bounds.centerX()}, ${autojs.bounds.centerY()\})`);
    autojs.clickCenter();
}

ocr.release();

OCR.release()

释放OCR资源,默认会在程序退出时自动释放,但请在不使用OCR及时释放以释放资源。

OCRResult

$ocr.detect()返回的数组的元素对象,包含了文字识别的可信度、文本内容、文本范围、文本旋转度以及文本旋转度的可信度等。

OCRResult.confidence

  • {number}

OCR文字的可信度,范围为[0, 1],越接近1表示结果越准确、可信。

OCRResult.text

  • {string}

OCR识别的文字内容。

OCRResult.bounds

该识别文字在图片中的范围。

OCRResult.rotation

  • {number}

该识别文字在图片中的旋转角度,范围为[0, 360),一般取值为0和180度。该字段仅在detect时指定detectRotationtrue时有效。

OCRResult.rotationConfidence

  • {number}

该识别文字的旋转角度可信度,范围为[0, 1]。该字段仅在detect时指定detectRotationtrue时有效。

OCRResult.javaObject

  • {object}

OCR识别结果的原始Java对象。在官方PaddleOCR中没有什么用,在其他官方OCR中可能可以获取附加的额外信息,比如行、字段落、词语分割。

OCRResult.clickCenter()

  • 返回 {boolean}

在屏幕上点击OCR结果在图片中范围的中点位置,返回是否点击成功。实际上相当于click(result.bounds.centerX(), result.bounds.centerY())