OCR识别
说明
- OCR模块是属于对图像进行识别
- OCR模块的对象前缀是ocr,例如 ocr.initOcr()这样调用
- 目前的OCR包含了mlkit,ocrLite,百度AI的easyedge,paddleocr,Tesseract,paddleOcrOnline和 百度在线识别
- Tesseract 请下载对应的语言包或者自己创建语言包
- 版本高于9.17.0的,请看 【Tesseract 例子 [高于9.17版本]】例子,因为api已经更改了
ocr.newOcr 实例一个ocr
- 初始化一个ocr实例
- 适配版本 EC安卓 9.17.0+
function main() {
let o = ocr.newOcr();
// 这里做初始化和识别
o.releaseAll()
}
ocr.initOcr 初始化
- 初始化OCR模块
- @param map map参数表
- key分别为:
- type : OCR类型,值分别为 tess = Tesseract模块,baiduOnline=百度在在线识别模块,paddleocr=百度离线的paddleocr,easyedge=百度AI OCR
- ocrLite = ocrLite, paddleOcrOnline = EC自带的PC端的paddleOcr服务程序
- 如果类型是 tess,请将训练的模型放到 /sdcard/tessdata/ 文件夹下
-
- 参数设置为 :
{"type":"tess","language":"chi_sim","debug":false,"ocrEngineMode":3}
- 参数设置为 :
-
- language: 语言数据集文件, 例如 chi_sim.traineddata 代表是中文简体语言,参数就填写 chi_sim,多个可以用+链接,例如:chi_sim+eng+num
- language: 语言数据集文件, 例如 chi_sim.traineddata 代表是中文简体语言,参数就填写 chi_sim,多个可以用+链接,例如:chi_sim+eng+num
-
- ocrEngineMode: 识别引擎类型,0 OEM_TESSERACT_ONLY , 1 OEM_LSTM_ONLY,2 OEM_TESSERACT_LSTM_COMBINED,3 OEM_DEFAULT
- ocrEngineMode: 识别引擎类型,0 OEM_TESSERACT_ONLY , 1 OEM_LSTM_ONLY,2 OEM_TESSERACT_LSTM_COMBINED,3 OEM_DEFAULT
-
- rilLevel: PageIteratorLevel 参数,-1 自适应, 0: RIL_BLOCK, 1: RIL_PARA, 2: RIL_TEXTLINE, 3: RIL_WORD, 4:RIL_SYMBOL
- rilLevel: PageIteratorLevel 参数,-1 自适应, 0: RIL_BLOCK, 1: RIL_PARA, 2: RIL_TEXTLINE, 3: RIL_WORD, 4:RIL_SYMBOL
-
- debug: 代码是否设置调试模式,一般设置false即可
- debug: 代码是否设置调试模式,一般设置false即可
-
- path: 放tessdata的文件夹路径,不要加上tessdata,是tessdata文件夹的父级
- path: 放tessdata的文件夹路径,不要加上tessdata,是tessdata文件夹的父级
- 如果类型是 baiduOnline, 参数设置为 :
{"type":"baiduOnline","ak":"xxx","sk":"xx"}
-
- ak = api key,sk = secret key, 百度OCR文档地址 : https://ai.baidu.com/ai-doc/OCR/Ck3h7y2ia
- ak = api key,sk = secret key, 百度OCR文档地址 : https://ai.baidu.com/ai-doc/OCR/Ck3h7y2ia
- 如果类型是 ocrLite,
-
- 参数设置为 :
{"type":"ocrLite","numThread":4,"padding":10,"maxSideLen":0}
- 参数设置为 :
-
- numThread: 线程数量。
- numThread: 线程数量。
-
- padding: 图像预处理,在图片外周添加白边,用于提升识别率,文字框没有正确框住所有文字时,增加此值。
- padding: 图像预处理,在图片外周添加白边,用于提升识别率,文字框没有正确框住所有文字时,增加此值。
-
- maxSideLen: 按图片最长边的长度,此值为0代表不缩放,例:1024,如果图片长边大于1024则把图像整体缩小到1024再进行图像分割计算,如果图片长边小于1024则不缩放,如果图片长边小于32,则缩放到32。
- maxSideLen: 按图片最长边的长度,此值为0代表不缩放,例:1024,如果图片长边大于1024则把图像整体缩小到1024再进行图像分割计算,如果图片长边小于1024则不缩放,如果图片长边小于32,则缩放到32。
- 如果类型设置为: paddleOcrOnline , 请到网盘中下载EasyClick-PaddleOcr.zip文件解压运行
{
"type": "paddleOcrOnline",
"ocrType": "ONNX_PPOCR_V3",
"padding": 50,
"maxSideLen": 0,
"boxScoreThresh": 0.5,
"boxThresh": 0.3,
"unClipRatio": 1.6,
"doAngleFlag": 0,
"mostAngleFlag": 0
}
* - ocrType : 模型 ONNX_PPOCR_V3,ONNX_PPOCR_V4,NCNN_PPOCR_V3
* - serverUrl:paddle ocr服务器地址,可以在其他电脑部署,然后中控链接,例如 192.168.2.8,部署在电脑就改ip地址即可,端口是 9022 可以不写
* - padding 图像外接白框,用于提升识别率,文字框没有正确框住所有文字时,增加此值。默认50。<br/>
* - maxSideLen 按图像长边进行总体缩放,放大增加识别耗时但精度更高,缩小减小耗时但精度降低,maxSideLen为0表示不缩放。<br/>
* - boxScoreThresh 文字框置信度门限,文字框没有正确框住所有文字时,减小此值 <br/>
* - boxThresh 同上,自行试验。<br/>
* - unClipRatio 单个文字框大小倍率,越大时单个文字框越大。<br/>
* - doAngleFlag 启用(1)/禁用(0) 文字方向检测,只有图片倒置的情况下(旋转90~270度的图片),才需要启用文字方向检测,默认关闭。<br/>
* - mostAngleFlag 启用(1)/禁用(0) 角度投票(整张图片以最大可能文字方向来识别),当禁用文字方向检测时,此项也不起作用,默认关闭。<br/>
* - limit 代表每1秒执行ocr请求个数 默认1000。可以适当降低减少cpu占用<br/>
* - checkImage 检查数据是否是图像(1是 0否)默认关闭。<br/>
- @return
{bool}
布尔型 成功或者失败
9.17+版本-单实例-paddleOcrOnline
- 注意 9.17+ ocr有单例变成多例模式,跟着下面的方式走,更改初始化initOcr的参数即可,之前的ocrlite、paddleOcrOnline都是支持的
let paddleOcrOnline = null
//脚本停止回调
setStopCallback(function () {
//释放所有资源,一般不需要调用,或者放到setStopCallback中
logi("释放paddleOcrOnline对象")
paddleOcrOnline.releaseAll()
})
//初始化自动化环境
function initEnv() {
if (!startEnv()) {
loge("自动化启动失败,结束脚本")
exit()
}
if (!image.requestScreenCapture(10000, 0)) {
loge("申请截图权限失败,检查是否开启后台弹出,悬浮框等权限")
exit()
}
//申请完权限至少等1s(垃圾设备多加点)再截图,否则会截不到图
sleep(1000)
}
//初始化所有ocr对象及环境
function initAllOcr() {
// paddleOcrOnline,参数参考上方解释,不需要的参数可以不填
let paddleOcrOnlineMap = {
"serverUrl": "10.0.0.112",
"type": "paddleOcrOnline",
"ocrType": "ONNX_PPOCR_V3",
}
//创建ocr对象,仅脚本开头一次即可
paddleOcrOnline = ocr.newOcr()
//初始化ocr,仅脚本开头一次即可
if (!paddleOcrOnline.initOcr(paddleOcrOnlineMap)) {
loge("OCR初始化失败 : " + paddleOcrOnline.getErrorMsg())
exit()
}
}
// ocr识别
function ocrFunc() {
// 截图
let img = image.captureFullScreenEx()
if (!img) {
loge("截图失败")
return
}
logi("===================paddleOcrOnline识别======================")
// 用ocrLite进行识别
let result = paddleOcrOnline.ocrImage(img, 20 * 1000, {})
if (result) {
logd("ocr结果-》 " + JSON.stringify(result))
for (let i = 0; i < result.length; i++) {
let value = result[i]
logd("文字 : " + value.label + " x: " + value.x + " y: " + value.y + " width: " + value.width + " height: " + value.height)
}
} else {
logw("未识别到结果")
}
//回收图片
image.recycle(img)
}
function main() {
//初始化环境
initEnv()
//初始化所有ocr对象及环境
initAllOcr()
//多次识别
ocrFunc()
ocrFunc()
ocrFunc()
}
main()