本地图片识别函数

函数:localOcrText() 本地图像识别

函数说明 : 将指定区域的图像识别成文字。
函数方法 : localOcrText(文本型 ocrpath,文本型 language,整数型 x1,整数型y1, 整数型 x2, 整数型 y2, 文本型 list);
返回值 : 文本型 text 数组 table

说明:使用该函数需要ocr语言包。
   下载地址:https://share.weiyun.com/5wZtDSS
   下载后, 将解压后的tessdata目录复制到设备中

参数类型说明
ocrpath文本型语言包tessdata目录的路径
language文本型语言类型 'eng' : 英文语言类型 'chi_sim' : 中文语言类型
x1整数型待识别图片区域的左上角X坐标
y1整数型待识别图片区域的左上角Y坐标
x2整数型待识别图片区域的右下角X坐标
y2整数型待识别图片区域的右下角Y坐标
list文本型设置白名单, 只有白名单中的字符才会被识别(可选)
返回值类型说明
text文本型图片识别后得到的答案, 失败的话返回空字符串
table数组返回的坐标等信息

返回的table坐标:

{
  {
    c = 90,         -- c 代表相似度
    char = "触",    -- char 代表识别的内容
    h = 30,         -- h 代表识别字体的高度
    w = 30,         -- w 代表识别字体的宽度
    x = 10,         -- x 代表相对识别范围的左上角 x 坐标
    y = 20          -- y 代表相对识别范围的左上角 y 坐标
  },
  ...
}

示例:识别中文

local inspect = require('inspect')
code,info = localOcrText("/var/touchelf/tessdata",  -- 语言包tessdata目录在设备中的路径
                                                "chi_sim",  -- 语言类型为中文
                                                  100,  -- 图片左上角X坐标为100
                                                  100,  -- 图片左上角Y坐标为100
                                                  200,  -- 图片右下角X坐标为200
                                                  200); -- 图片右下角Y坐标为200
if code == "" then
    notifyMessage("识别失败");
else
    notifyMessage(string.format("识别成功: %s", code));
    logDebug(inspect(info))
end

示例:识别英文和数字

code = localOcrText("/var/touchelf/tessdata",  -- 语言包tessdata目录在设备中的路径
                                                "eng",  -- 语言类型为英文
                                                  100,  -- 图片左上角X坐标为100
                                                  100,  -- 图片左上角Y坐标为100
                                                  200,  -- 图片右下角X坐标为200
                                                  200); -- 图片右下角Y坐标为200
if code == "" then
    notifyMessage("识别失败");
else
    notifyMessage(string.format("识别成功: %s", code));
end

示例:只识别数字

code = localOcrText("/mnt/sdcard/touchelf/tessdata",  -- 语言包tessdata目录在设备中的路径
                                                "eng",  -- 语言类型为中文
                                                  100,  -- 图片左上角X坐标为100
                                                  100,  -- 图片左上角Y坐标为100
                                                  200,  -- 图片右下角X坐标为200
                                                  200,  -- 图片右下角Y坐标为200
                                         "0123456789"); -- 设置白名单字符串, 只识别数字
if code == "" then
    notifyMessage("识别失败");
else
    notifyMessage(string.format("识别成功: %s", code));
end

注意事项:

1,该函数对非正规字体识别欠佳,建议识别一些背景无杂色的英文和数字。
2,需要下载ocr语言包。

函数:localOcrTextEx() 本地图片识别

函数说明 : 将本地图片识别成文字。支持合并图片识别
函数方法 : localOcrTextEx(文本型 ocrpath,文本型 language,文本型 whilelist,文本型 picpath1,文本型 picpath2,...,文本型 picpathn);
返回值 : 文本型 text 数组 table
支持版本: 4.1.1以上

说明:使用该函数需要ocr语言包。
   下载地址:见localOcrText函数
   下载后, 将解压后的tessdata目录复制到设备中

参数类型说明
ocrpath文本型语言包tessdata目录的路径
language文本型语言类型 'eng' : 英文语言类型 'chi_sim' : 中文语言类型
whilelist文本型设置白名单, 只有白名单中的字符才会被识别
picpath1文本型待合并的第一个图片的路径
picpath2文本型待合并的第二个图片的路径
picpath...文本型待合并的第...个图片的路径
picpathn文本型待合并的第n个图片的路径
返回值类型说明
text文本型图片识别后得到的答案, 失败的话返回空字符串
table数组返回的坐标等信息

返回的table坐标:

{
  {
    c = 90,         -- c 代表相似度
    char = "触",    -- char 代表识别的内容
    h = 30,         -- h 代表识别字体的高度
    w = 30,         -- w 代表识别字体的宽度
    x = 10,         -- x 代表相对识别范围的左上角 x 坐标
    y = 20          -- y 代表相对识别范围的左上角 y 坐标
  },
  ...
}

识别一张图片并且白名单为空

local inspect = require('inspect')
snapshotRegion("/var/touchelf/x.bmp",100,100,200,200);
code, info = localOcrTextEx("/var/touchelf/tessdata",         -- 语言包tessdata目录在设备中的路径
                                                "eng",  -- 语言类型为英文
                                                "",     -- 白名单为空
                                                "/var/touchelf/x.bmp"); -- 图片地址
if code == "" then
    notifyMessage("识别失败");
else
    notifyMessage(string.format("识别成功: %s", code));
    logDebug(inspect(info))
end

合并多张图片识别且只识别数字

snapshotRegion("/var/touchelf/1.bmp",100,100,200,200);
snapshotRegion("/var/touchelf/2.bmp",100,100,200,200);
snapshotRegion("/var/touchelf/3.bmp",100,100,200,200);
code = localOcrTextEx("/var/touchelf/tessdata",         -- 语言包tessdata目录在设备中的路径
                                                "eng",  -- 语言类型为英文
                                                "0123456789",     -- 白名单为空
                                                "/var/touchelf/1.bmp", --待合并的第一个图片
                                                "/var/touchelf/2.bmp", -- 待合并的第二个图片
                                                "/var/touchelf/3.bmp"); -- 待合并的第三个图片
if code == "" then
    notifyMessage("识别失败");
else
    notifyMessage(string.format("识别成功: %s", code));
end

当需要识别的内容非常小识别不准确时(如下图的等级)可尝试下面方法

image.png

function main()
    f = "/var/touchelf/1.jpg" --截图路径
    snapshotRegion(f, 245,520, 269,538,400) --截等级显示的范围,最后一个参数400为图片放大4倍
    imageFilter(f,{0xF8D268}, 80) -- 取字体的颜色将图片二值化
    code = localOcrTextEx("/var/touchelf/tessdata", "eng", "", f) --识别图片内容
    logDebug(code)
end

1.jpg

放大并二值化后的图片.更有利准确识别