Skip to content

光学字符识别 (OCR)

ocr 模块用于识别图像中的文本.

AutoJs6 的 OCR 特性支持 Google ML Kit, Baidu PaddlePaddle Paddle Lite 以及 Rapid OCR 相关实现.

6.7.0 源码校对

本页已按 AutoJs6 6.7.0 (ed3eb10e88db5a8425fd94bdddefa4176e5e1c94) 对照以下源码路径校对:

  • app/src/main/java/org/autojs/autojs/runtime/ScriptRuntime.kt
  • app/src/main/java/org/autojs/autojs/runtime/api/augment/ocr/Ocr.kt
  • app/src/main/java/org/autojs/autojs/runtime/api/augment/ocr/OcrMLKit.kt
  • app/src/main/java/org/autojs/autojs/runtime/api/augment/ocr/OcrPaddle.kt
  • app/src/main/java/org/autojs/autojs/runtime/api/augment/ocr/OcrRapid.kt

运行时中 ocr / $ocr 由 augment 注入, ocr 本身可调用, 等价于 ocr.recognizeText(...). 当前模式包括 mlkit, paddle, rapid, unknown; 嵌套对象 ocr.mlkit, ocr.paddle, ocr.rapid 也都可调用, 并公开 recognizeText / detect.

ocr.tap(mode) 可通过字符串或嵌套模式对象切换模式; 未知模式会抛出异常. recognizeText / detect 最多接受 3 个参数: 第一个参数为字符串时读取图片路径; 第一个参数不是 ImageWrapper 时会尝试截屏; 第二参数为区域时会包装为 { region }, 否则按选项对象处理.

设置 region 时, 源码会先裁剪图片再 OCR, 并把 detect 的边界坐标偏移回原图坐标. detect 返回 OcrResult[], recognizeText 返回字符串数组.

ML Kit 与 Rapid 的 options 当前除 region / 模式分派外基本保留; Paddle 选项包括 cpuThreadNum, useSlim, useOpenCL, detLongSize, scoreThreshold, mergeLine, splitWords, useWordSegmentation, useRaw / raw, imageQuality, imageFormat 等. 非 INRT 环境会选择 Paddle OCR 插件, 无插件时抛错; INRT 环境使用内置引擎.


ocr


[@] ocr

ocr 可作为全局对象使用:

js
typeof ocr; // "function"
typeof ocr.detect; // "function"
typeof ocr.recognizeText; // "function"

ocr(options?)

6.4.0 Overload [1-2]/9

识别当前屏幕截图中包含的所有文本, 返回文本数组.

ocr() 相当于以下代码的整合:

js
images.requestScreenCapture();
let img = images.captureScreen();
ocr(img);

同时也是 ocr.recognizeText(options?) 的别名方法.

ocr(region)

6.4.0 Overload 3/9

识别当前屏幕截图指定区域内包含的所有文本, 返回文本数组.

ocr(region) 相当于以下代码的整合:

js
images.requestScreenCapture();
let img = images.captureScreen();
ocr(img, region);

同时也是 ocr({ region: region }) 的便捷方法,

以及 ocr.recognizeText(region) 的别名方法.

关于 OCR 区域参数 region 的更多用法, 参阅 OcrOptions#region 小节.

ocr(img, options?)

6.3.0 Overload [4-5]/9

识别图像包含的所有文本, 返回文本数组.

ocr.recognizeText(img, options?) 的别名方法.

js
/* 申请屏幕截图权限. */
images.requestScreenCapture();

/* 截屏并获取包装图像对象. */
let img = images.captureScreen();

/* OCR 识别并获取结果, 结果为字符串数组. */
let results = ocr(img);

/* 结果过滤, 筛选出文本中可部分匹配 "app" 的结果, 如 "apple", "disappear" 等. */
results.filter(text => text.includes('app'));

ocr(img, region)

6.3.0 Overload 6/9

识别指定区域内图像包含的所有文本, 返回文本数组.

ocr(img, { region: region }) 的便捷方法.

ocr.recognizeText(img, region) 的别名方法.

js
/* 申请屏幕截图权限. */
images.requestScreenCapture();

/* 截屏并获取包装图像对象. */
let img = images.captureScreen();

/* 在区域 [ 0, 0, 100, 150 ] 内进行 OCR 识别并获取结果, 结果为字符串数组. */
let results = ocr(img, [ 0, 0, 100, 150 ]);

/* 结果过滤, 筛选出文本中可部分匹配 "app" 的结果, 如 "apple", "disappear" 等. */
results.filter(text => text.includes('app'));

关于 OCR 区域参数 region 的更多用法, 参阅 OcrOptions#region 小节.

ocr(imgPath, options?)

6.3.0 Overload [7-8]/9

识别指定路径对应图像包含的所有文本, 返回文本数组.

当指定路径无法解析为包装图像对象时, 将抛出 TypeError 异常.

ocr.recognizeText(imgPath, options?) 的别名方法.

js
ocr('./picture.jpg'); /* 获取本地图像文件中的所有文本. */

ocr(imgPath, region)

6.3.0 Overload 9/9

识别指定路径对应图像在指定区域内包含的所有文本, 返回文本数组.

当指定路径无法解析为包装图像对象时, 将抛出 TypeError 异常.

ocr(imgPath, { region: region }) 的便捷方法.

ocr.recognizeText(imgPath, region) 的别名方法.

js
/* 获取本地图像文件在区域 [ 0, 0, 100, 150 ] 内的所有文本. */
ocr('./picture.jpg', [ 0, 0, 100, 150 ]);

关于 OCR 区域参数 region 的更多用法, 参阅 OcrOptions#region 小节.

[p] mode

6.3.4 Getter/Setter

获取或设置 OCR 的工作模式名称.

js
/* AutoJs6 OCR 默认采用 MLKit 工作模式. */
console.log(ocr.mode); // "mlkit"

ocr.mode = 'paddle'; /* 切换到 Paddle 工作模式. */
console.log(ocr.mode); // "paddle"

ocr.mode = 'rapid'; /* 切换到 Rapid OCR 工作模式. */
console.log(ocr.mode); // "rapid"

ocr.mode = 'mlkit'; /* 再次切换到 MLKit 工作模式. */
console.log(ocr.mode); // "mlkit"

当使用不同的工作模式名称时, ocr 全局方法及其相关方法 (如 ocr.detect) 将使用不同的引擎, 进而可能获得不同的识别速度和结果.

注: 使用 Paddle 工作模式时, 建议开启 AutoJs6 的 "忽略电池优化" 开关, 并降低对 AutoJs6 节电及后台运行等方面的限制, 否则可能导致应用崩溃.

[m] recognizeText

用于识别图像中的全部文本.

recognizeText 方法与工作模式有关, 例如当工作模式为 paddle 时, ocr.recognizeText(...)ocr.paddle.recognizeText(...) 等价.

ocr.recognizeText(...) 相关方法均可简写为 ocr(...).

recognizeText(options?)

6.4.0 Overload [1-2]/9

识别当前屏幕截图中包含的所有文本, 返回文本数组.

ocr.recognizeText() 相当于以下代码的整合:

js
images.requestScreenCapture();
let img = images.captureScreen();
ocr.recognizeText(img);

ocr.recognizeText(options?)ocr(options?) 等价.

recognizeText(region)

6.4.0 Overload 3/9

识别当前屏幕截图指定区域内包含的所有文本, 返回文本数组.

ocr.recognizeText(region) 相当于以下代码的整合:

js
images.requestScreenCapture();
let img = images.captureScreen();
ocr.recognizeText(img, region);

ocr.recognizeText({ region: region }) 的便捷方法.

ocr.recognizeText(region)ocr(region) 等价.

关于 OCR 区域参数 region 的更多用法, 参阅 OcrOptions#region 小节.

recognizeText(img, options?)

6.3.0 Overload [4-5]/9

识别图像包含的所有文本, 返回文本数组.

ocr.recognizeText(img, options?)ocr(img, options?) 等价.

js
images.requestScreenCapture(); /* 申请屏幕截图权限. */
let img = images.captureScreen(); /* 截屏并获取包装图像对象. */
ocr.recognizeText(img).filter(text => text.includes('app')); /* 过滤结果. */

recognizeText(img, region)

6.3.0 Overload 6/9

识别指定区域内图像包含的所有文本, 返回文本数组.

ocr.recognizeText(img, { region: region }) 的便捷方法.

ocr.recognizeText(img, region)ocr(img, region) 等价.

js
images.requestScreenCapture(); /* 申请屏幕截图权限. */
let img = images.captureScreen(); /* 截屏并获取包装图像对象. */
ocr.recognizeText(img, [ 0, 0, 100, 150 ]).filter(text => text.includes('app')); /* 过滤结果. */

关于 OCR 区域参数 region 的更多用法, 参阅 OcrOptions#region 小节.

recognizeText(imgPath, options?)

6.3.0 Overload [7-8]/9

识别指定路径对应图像包含的所有文本, 返回文本数组.

当指定路径无法解析为包装图像对象时, 将抛出 TypeError 异常.

ocr.recognizeText(imgPath, options?)ocr(imgPath, options?) 等价.

js
ocr.recognizeText('./picture.jpg'); /* 获取本地图像文件中的所有文本. */

recognizeText(imgPath, region)

6.3.0 Overload 9/9

识别指定路径对应图像在指定区域内包含的所有文本, 返回文本数组.

当指定路径无法解析为包装图像对象时, 将抛出 TypeError 异常.

ocr.recognizeText(imgPath, { region: region }) 的便捷方法.

ocr.recognizeText(imgPath, region)ocr(imgPath, region) 等价.

js
/* 获取本地图像文件在区域 [ 0, 0, 100, 150 ] 内的所有文本. */
ocr.recognizeText('./picture.jpg', [ 0, 0, 100, 150 ]);

关于 OCR 区域参数 region 的更多用法, 参阅 OcrOptions#region 小节.

[m] detect

用于识别图像中的全部文本.

detect 方法与工作模式有关, 例如当工作模式为 paddle 时, ocr.detect(...)ocr.paddle.detect(...) 等价.

recognizeText 不同, detect 返回的结果包含更多信息, 包括 [ 文本标签, 置信度, 位置矩形 ] 等, recognizeText 精简了 detect 返回的结果, 仅包含文本标签数据.

detect(options?)

6.4.0 Overload [1-2]/9

识别当前屏幕截图中包含的所有文本, 返回 OcrResult 数组.

ocr.detect() 相当于以下代码的整合:

js
images.requestScreenCapture();
let img = images.captureScreen();
ocr.detect(img);

detect(region)

6.4.0 Overload 3/9

识别当前屏幕截图指定区域内包含的所有文本, 返回 OcrResult 数组.

ocr.detect(region) 相当于以下代码的整合:

js
images.requestScreenCapture();
let img = images.captureScreen();
ocr.detect(img, region);

同时也是 ocr.detect({ region: region }) 的便捷方法.

关于 OCR 区域参数 region 的更多用法, 参阅 OcrOptions#region 小节.

detect(img, options?)

6.3.0 Overload [4-5]/9

识别图像包含的所有文本, 返回 OcrResult 数组.

js
/* 申请屏幕截图权限. */
images.requestScreenCapture();

/* 截屏并获取包装图像对象. */
let img = images.captureScreen();

/* 获取本地图像文件中的所有识别结果. */
let result = ocr.detect(img);

/* 筛选置信度高于 0.8 的结果. */
result.filter(o => o.confidence >= 0.8);

detect(img, region)

6.3.0 Overload 6/9

识别指定路径对应图像在指定区域内包含的所有文本, 返回 OcrResult 数组.

ocr.detect(img, { region: region }) 的便捷方法.

js
/* 申请屏幕截图权限. */
images.requestScreenCapture();

/* 截屏并获取包装图像对象. */
let img = images.captureScreen();

/* 获取本地图像文件在区域 [ 0, 0, 100, 150 ] 内的所有识别结果. */
let result = ocr.detect(img, [ 0, 0, 100, 150 ]);

/* 筛选置信度高于 0.8 的结果. */
result.filter(o => o.confidence >= 0.8);

关于 OCR 区域参数 region 的更多用法, 参阅 OcrOptions#region 小节.

detect(imgPath, options?)

6.3.0 Overload [7-8]/9

识别指定路径对应图像包含的所有文本, 返回 OcrResult 数组.

当指定路径无法解析为包装图像对象时, 将抛出 TypeError 异常.

js
let result = ocr.detect('./picture.jpg'); /* 获取本地图像文件中的所有识别结果. */
result.filter(o => o.confidence >= 0.8); /* 筛选置信度高于 0.8 的结果. */

detect(imgPath, region)

6.3.0 Overload 9/9

识别指定路径对应图像在指定区域内包含的所有文本, 返回 OcrResult 数组.

当指定路径无法解析为包装图像对象时, 将抛出 TypeError 异常.

ocr.detect(imgPath, { region: region }) 的便捷方法.

js
/* 获取本地图像文件在区域 [ 0, 0, 100, 150 ] 内的所有识别结果. */
let result = ocr.detect('./picture.jpg', [ 0, 0, 100, 150 ]);

/* 筛选置信度高于 0.8 的结果. */
result.filter(o => o.confidence >= 0.8);

关于 OCR 区域参数 region 的更多用法, 参阅 OcrOptions#region 小节.

[m] tap

tap(mode)

6.3.4

用于切换 OCR 工作模式, 相当于 ocr.mode 的 setter 形式.

js
ocr.tap('paddle');
ocr.mode = 'paddle'; /* 同上. */

[m] summary

summary()

6.4.0

获取 AutoJs6 OCR 功能的摘要.

摘要中表述了 OCR 功能当前使用的工作模式, 以及全部可用的工作模式.

js
/* e.g. [ OCR summary ]
 * Current mode: mlkit
 * Available modes: [ mlkit, paddle, rapid ]
 */
console.log(ocr.summary());

工作模式与代码形式

截至 AutoJs6 6.7.0, ocr 支持 mlkit, paddle, rapid 三种主要工作模式.

工作模式的获取或设置可通过 ocr.mode 实现.

下面以 mlkit 为例, 总结 mlkit 工作模式可用的全部代码形式.

  1. ocr.mlkit.detect(...)
  2. ocr.mlkit.recognizeText(...)
  3. ocr.mlkit(...)
  4. ocr.detect(...)
  5. ocr.recognizeText(...)
  6. ocr(...)

上述 6 种代码形式均可实现使用 mlkit 引擎进行光学字符识别.

其中, [ 3 ] 是 [ 2 ] 的简便写法, [ 6 ] 是 [ 5 ] 的简便写法.

另外, [ 4, 5, 6 ] 三种形式的条件, 是 OCR 工作模式为 mlkit, 即 ocr.mode 返回 mlkit. 否则需要调用 ocr.mode = 'mlkit' 切换工作模式.

下面再以 paddle 为例, 总结 paddle 工作模式可用的全部代码形式.

  1. ocr.paddle.detect(...)
  2. ocr.paddle.recognizeText(...)
  3. ocr.paddle(...)
  4. ocr.detect(...)
  5. ocr.recognizeText(...)
  6. ocr(...)

同样, [ 4, 5, 6 ] 三种形式的条件, 是 OCR 工作模式为 paddle, 即 ocr.mode 返回 paddle. 否则需要调用 ocr.mode = 'paddle' 切换工作模式.

rapid 工作模式同样支持:

  1. ocr.rapid.detect(...)
  2. ocr.rapid.recognizeText(...)
  3. ocr.rapid(...)
  4. ocr.detect(...)
  5. ocr.recognizeText(...)
  6. ocr(...)

同样, [ 4, 5, 6 ] 三种形式的条件, 是 OCR 工作模式为 rapid, 即 ocr.mode 返回 rapid. 否则需要调用 ocr.mode = 'rapid' 切换工作模式.

由此可见, ocr(...)ocr.detect(...) 等方法是动态变化的, 其功能取决于工作模式. 这种形式的优点是写法简单, 但可读性相对较差, 可能难以辨识 OCR 的具体工作引擎. 如需兼顾可读性, 则可使用 ocr.mlkit(...), ocr.paddle(...), ocr.rapid(...) 和对应 detect(...) 等形式.

AutoJs6 应用文档