识别模块

分类:本地图像识别

函数:ocr.tess.ocr() 本地图像识别

原函数名 : localOcrText
函数说明 : 将指定区域的图像识别成文字。
函数方法 : ocr.tess.ocr(路径 tess, 语言 lang?, 左上角坐标x?, 左上角坐标y?, 右下角坐标x?, 右下角坐标y?, 白名单 whitelist?);
返回值 : 文字 text 坐标数组 table

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

参数类型说明必填
tessstring语言包tessdata目录的路径必填
langstring语言类型 'eng' : 英文语言类型 'chi_sim' : 中文语言类型非必填,默认 eng
ltxnumber待识别区域的左上角X坐标非必填,默认全屏识别
ltynumber待识别区域的左上角Y坐标非必填,默认全屏识别
rbxnumber待识别区域的右下角X坐标非必填,默认全屏识别
rbynumber待识别区域的右下角Y坐标非必填,默认全屏识别
whitelist文本型设置白名单, 只有白名单中的字符才会被识别非必填
返回值类型说明
textstring图片识别后得到的答案, 失败的话返回空字符串
tabletable返回的坐标等信息

返回的table坐标:

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

示例:识别中文

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

示例:识别英文和数字

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

示例:只识别数字

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

注意事项:

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

函数:ocr.tess.ocrEx() 本地图像识别扩展

原函数名 : localOcrTextEx
函数说明 : 将本地图片识别成文字。支持合并图片识别
函数方法 : ocr.tess.ocrEx(路径 tess,语言 lang,白名单 whilelist,图像路径 picpath1,图像路径 picpath2,...,图像路径 picpathn);
返回值 : 文本型 text 数组 table

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

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

返回的table坐标:

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

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

screen.snapshot("/var/touchelf/x.png",100,100,200,200);
code, info = ocr.tess.ocrEx("/var/touchelf/tessdata",         -- 语言包tessdata目录在设备中的路径
                            "eng",  -- 语言类型为英文
                            "",     -- 白名单为空
                            "/var/touchelf/x.png"); -- 图片地址
if code == "" then
    sys.dialog("识别失败");
else
    sys.dialog(string.format("识别成功: %s", code));
    sys.log(info)
end

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

screen.snapshot("/var/touchelf/1.png",100,100,200,200);
screen.snapshot("/var/touchelf/2.png",100,100,200,200);
screen.snapshot("/var/touchelf/3.png",100,100,200,200);
code, info = ocr.tess.ocrEx("/var/touchelf/tessdata",    -- 语言包tessdata目录在设备中的路径
                            "eng",  -- 语言类型为英文
                            "0123456789",     -- 白名单为数字
                            "/var/touchelf/1.png", --待合并的第一个图片
                            "/var/touchelf/2.png", -- 待合并的第二个图片
                            "/var/touchelf/3.png"); -- 待合并的第三个图片
if code == "" then
    sys.dialog("识别失败");
else
    sys.dialog(string.format("识别成功: %s", code));
    sys.log(info)
end

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

image.png

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

1.jpg

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

分类:远程图像识别

函数:ocr.cloud.ocr() 远程图像识别

原函数名 : cloudOcrText
函数说明 : 连接答题平台进行图片识别。
函数方法 : ocr.cloud.ocr(密码串 sign,题目类型 type,左上角坐标x,左上角坐标y, 右下角坐标x, 右下角坐标y, 超时 timeout);
返回值 : 文本型 code

参数类型说明
signstring密码串
typestring题目类型, 请前往选择的代答平台的官网查询
ltxnumber待识别区域的左上角X坐标
ltynumber待识别区域的左上角Y坐标
rbxnumber待识别区域的右下角X坐标
rbynumber待识别区域的右下角Y坐标
timeoutnumber超时时间, 范围为20-600秒
速安答题key : 密码串(http://st.suanst.com注册并登陆后, 在会员中心获取), 如username|9CF16235AD9EFBD3F233265DF9400E6A
返回值类型说明
code文本型图片识别后得到的答案, 失败的话返回空字符串

示例

code = ocr.cloud.ocr("username|PASSWORDAD9EFBD3F233265DF9400E6A",  -- 答题参数1为密码串(http://st.suanst.com注册并登陆后, 在会员中心获取)
                    "1004",  -- 题目类型为"1004"(4位数字字母)
                    100,  -- 图片左上角X坐标为100
                    100,  -- 图片左上角Y坐标为100
                    200,  -- 图片右下角X坐标为200
                    200,  -- 图片右下角Y坐标为200
                    600); -- 超时时间为600秒
if code == "" then
    sys.dialog("识别失败");
else
    sys.dialog(string.format("识别成功: %s", code));
end

函数:ocr.cloud.ocrEx() 远程图像识别扩展

原函数名 : cloudOcrTextEx
函数说明 : 将参数中指定的任意个数的图片合并成一个图片后, 连接远程答题平台进行图片识别。
函数方法 : ocr.cloud.ocrEx(密码串 sign,题目类型 type, 超时 timeout,图像路径 picpath1,图像路径 picpath2,...,图像路径 picpathn,);
返回值 : 文本型 code

参数类型说明
sign文本型密码串
type文本型题目类型, 请前往代答平台的官网查询
timeout整数型超时时间, 范围为20-600秒
picpath1文本型待合并的第一个图片的路径
picpath2文本型待合并的第二个图片的路径
picpath...文本型待合并的第...个图片的路径
picpathn文本型待合并的第n个图片的路径
答题key : 密码串(http://st.suanst.com注册并登陆后, 在会员中心获取), 如username|9CF16235AD9EFBD3F233265DF9400E6A
返回值类型说明
code文本型图片识别后得到的答案, 失败的话返回空字符串

示例:合并三张图片进行远程识别

screen.snapshot("/var/touchelf/1.png");   -- 将屏幕截图为/var/touchelf/1.png图片
screen.snapshot("/var/touchelf/2.png");   -- 将屏幕截图为/var/touchelf/2.png图片
screen.snapshot("/var/touchelf/3.png");   -- 将屏幕截图为/var/touchelf/3.png图片
-------------------------------------------
-- 下面的代码将1.png、2.png和3.png合并成一个图片后
-- 发送到远程代答平台进行图片识别
-------------------------------------------
code = ocr.cloud.ocrEx("username|PASSWORDAD9EFBD3F233265DF9400E6A",  -- -- 答题参数1为密码串(http://st.suanst.com注册并登陆后, 在会员中心获取"
                                 "1004",  -- 题目类型为"1004"(4位数字字母)
                                    600,  -- 超时时间为600秒
                  "/var/touchelf/1.png",  -- 待合并的第一个图片
                  "/var/touchelf/2.png",  -- 待合并的第二个图片
                  "/var/touchelf/3.png"); -- 待合并的第三个图片
if code == "" then
    sys.dialog("识别失败");
else
    sys.dialog(string.format("识别成功: %s", code));
end

分类:制作字库识别

教程:制作字库

1.打开vscode的触摸精灵插件

image.png

2.右键点击设备列表,选择触摸抓抓

image.png

3.在打开的抓抓页面中点击字库生成

image.png

4.取字的颜色填写到二值化下面的框中,调整二值化的精度(范围0-100),将图片二值化

image.png

如果字体有多种颜色,颜色之间用 , 分割 例如: 0xFFFFFF,0xAAAAAA,0x333333

5.点击添加,输入字键,点击字值框,然后框选数据,添加完成后点击生成字库
字库制作.gif

函数:ocr.font.init() 字库初始化

原函数名 : fontInit
函数说明 : 初始化字库/加载字库。
函数方法 : ocr.font.init(字库 lib);
返回值 : 无

参数类型说明
libtable字库数组

示例

function main()
    local fontLib = {
            {'触', {0xFFFFFF}, 90, 'iVBORw0KGgoAAAANSUhEUgAAABcAAAAcCAYAAACK7SRjAAAAsUlEQVR4AbXBAYrCMAAAwd2Q/395z4IFEbWtXmbshkUGCw0WGryg8g2VR4OLVM4afEHljMFFFRUqRyZ3Ko9UdhXPKlQq3pncVexUKo5UfDJYaHCBispZgwsqNipnDC6q2KgcGbyhoqLyrGKj8snkicqu4p2KI5MblV2FSsWvJjcVv1LZqGwqJl9QeadiNzlJZVfxisqjyUkVVw0WGiw0WGhyp7Kr+A92wyKDhQYLDRb6A6nTR1D8mGLiAAAAAElFTkSuQmCC'}, 
            {'摸', {0xFFFFFF}, 90, 'iVBORw0KGgoAAAANSUhEUgAAABUAAAAZCAYAAADe1WXtAAAAi0lEQVR4AbXBQWrDMAAAwV2h/3956x4KxogkrqMZO/Blgw0GH1L51GCDyUHlEyrvVEwOFWcqFe+oVFwNFipUXlGpWBlsMNhAIF6ouFL5VbFiB75ssMFgg8mJyn9V/JksVNyhcjbYYLDBZEHliclCxR0qZ4OLiqcGFypPTRZUnpgsVNyhcmYHvmywwQ8PTzQ4ee0K3AAAAABJRU5ErkJggg=='}
            }
    ocr.font.init(fontLib)
end

注意事项:

只有初始化字库后才能找字 识字

函数:ocr.font.find() 字库找字

原函数名 : fontFindText,fontFindTextEx
函数说明 : 通过触摸精灵字库返回文字坐标。
函数方法 : ocr.font.find(字 str,左上角坐标x?,左上角坐标y?, 右下角坐标x?, 右下角坐标y?,精度 fuzzy?,所有坐标all?);
返回值 : 坐标x,y 或坐标数组(all为true时)

参数类型说明必填
strstring要查找的字必填
ltxnumber欲寻找的区域左上角的X坐标非必填,默认全屏
ltynumber欲寻找的区域左上角的Y坐标非必填,默认全屏
rbxnumber欲寻找的区域右下角的X坐标非必填,默认全屏
rbynumber欲寻找的区域右下角的Y坐标非必填,默认全屏
fuzzynumber精度,范围:1 ~ 100,数值越大精度越高,100为完全匹配非必填,默认100
allboolean是否返回所有符合条件的坐标非必填,默认为false
返回值类型说明
xnumber找到的坐标X值,未找到返回 -1
ynumber找到的坐标Y值,未找到返回 -1
all为true的返回值类型说明
tabletable范围内找到的坐标table,未找到返回 {} 空数组

区域范围找字示例

function main()
    local fontLib = {
            {'触', {0xFFFFFF}, 90, 'iVBORw0KGgoAAAANSUhEUgAAABcAAAAcCAYAAACK7SRjAAAAsUlEQVR4AbXBAYrCMAAAwd2Q/395z4IFEbWtXmbshkUGCw0WGryg8g2VR4OLVM4afEHljMFFFRUqRyZ3Ko9UdhXPKlQq3pncVexUKo5UfDJYaHCBispZgwsqNipnDC6q2KgcGbyhoqLyrGKj8snkicqu4p2KI5MblV2FSsWvJjcVv1LZqGwqJl9QeadiNzlJZVfxisqjyUkVVw0WGiw0WGhyp7Kr+A92wyKDhQYLDRb6A6nTR1D8mGLiAAAAAElFTkSuQmCC'}, 
            {'摸', {0xFFFFFF}, 90, 'iVBORw0KGgoAAAANSUhEUgAAABUAAAAZCAYAAADe1WXtAAAAi0lEQVR4AbXBQWrDMAAAwV2h/3956x4KxogkrqMZO/Blgw0GH1L51GCDyUHlEyrvVEwOFWcqFe+oVFwNFipUXlGpWBlsMNhAIF6ouFL5VbFiB75ssMFgg8mJyn9V/JksVNyhcjbYYLDBZEHliclCxR0qZ4OLiqcGFypPTRZUnpgsVNyhcmYHvmywwQ8PTzQ4ee0K3AAAAABJRU5ErkJggg=='}
            }
    ocr.font.init(fontLib)
    x, y = ocr.font.find("触", 100, 100, 200, 200)
    sys.log(string.format("找到的坐标:%s,%s",x,y))
end

区域范围找字,精度90,返回所有符合的坐标示例

function main()
    local fontLib = {
            {'触', {0xFFFFFF}, 90, 'iVBORw0KGgoAAAANSUhEUgAAABcAAAAcCAYAAACK7SRjAAAAsUlEQVR4AbXBAYrCMAAAwd2Q/395z4IFEbWtXmbshkUGCw0WGryg8g2VR4OLVM4afEHljMFFFRUqRyZ3Ko9UdhXPKlQq3pncVexUKo5UfDJYaHCBispZgwsqNipnDC6q2KgcGbyhoqLyrGKj8snkicqu4p2KI5MblV2FSsWvJjcVv1LZqGwqJl9QeadiNzlJZVfxisqjyUkVVw0WGiw0WGhyp7Kr+A92wyKDhQYLDRb6A6nTR1D8mGLiAAAAAElFTkSuQmCC'}, 
            {'摸', {0xFFFFFF}, 90, 'iVBORw0KGgoAAAANSUhEUgAAABUAAAAZCAYAAADe1WXtAAAAi0lEQVR4AbXBQWrDMAAAwV2h/3956x4KxogkrqMZO/Blgw0GH1L51GCDyUHlEyrvVEwOFWcqFe+oVFwNFipUXlGpWBlsMNhAIF6ouFL5VbFiB75ssMFgg8mJyn9V/JksVNyhcjbYYLDBZEHliclCxR0qZ4OLiqcGFypPTRZUnpgsVNyhcmYHvmywwQ8PTzQ4ee0K3AAAAABJRU5ErkJggg=='}
            }
    ocr.font.init(fontLib)
    points = ocr.font.find("触", 100, 100, 200, 200, 90, true)
    sys.log(points)
end

返回的table坐标:

{
  {
    x = 10,
    y = 20 
  },
  {
    x = 100,
    y = 200
  }
  ...
}

注意事项:

1.初始化字库运行一次即可,不用每次找字都初始化字库.
2.范围填写 0,0,-1,-1 可全屏查找

函数:ocr.font.ocr() 字库识字

原函数名 : fontOcrText
函数说明 : 将指定区域的图像识别成文字。
函数方法 : ocr.font.ocr(左上角坐标x?,左上角坐标y?, 右下角坐标x?, 右下角坐标y?,精度 fuzzy?);
返回值 : 文字 text, 坐标数组 table

参数类型说明必填
ltxnumber欲识别的区域左上角的X坐标非必填,默认全屏
ltynumber欲识别的区域左上角的Y坐标非必填,默认全屏
rbxnumber欲识别的区域右下角的X坐标非必填,默认全屏
rbynumber欲识别的区域右下角的Y坐标非必填,默认全屏
fuzzynumber精度,范围:1 ~ 100,数值越大精度越高,100为完全匹配非必填,默认为100
返回值类型说明
textstring识别后得到的答案, 失败的话返回空字符串
tabletable返回的坐标等信息

返回的table坐标:

{
  {
    char = "触",    -- char 代表识别的内容
    x = 10,         -- x 坐标
    y = 20          -- y 坐标
  },
  {
    char = "摸", 
    x = 100, 
    y = 200
  }
  ...
}

示例:

function main()
    local fontLib = {
            {'触', {0xFFFFFF}, 90, 'iVBORw0KGgoAAAANSUhEUgAAABcAAAAcCAYAAACK7SRjAAAAsUlEQVR4AbXBAYrCMAAAwd2Q/395z4IFEbWtXmbshkUGCw0WGryg8g2VR4OLVM4afEHljMFFFRUqRyZ3Ko9UdhXPKlQq3pncVexUKo5UfDJYaHCBispZgwsqNipnDC6q2KgcGbyhoqLyrGKj8snkicqu4p2KI5MblV2FSsWvJjcVv1LZqGwqJl9QeadiNzlJZVfxisqjyUkVVw0WGiw0WGhyp7Kr+A92wyKDhQYLDRb6A6nTR1D8mGLiAAAAAElFTkSuQmCC'}, 
            {'摸', {0xFFFFFF}, 90, 'iVBORw0KGgoAAAANSUhEUgAAABUAAAAZCAYAAADe1WXtAAAAi0lEQVR4AbXBQWrDMAAAwV2h/3956x4KxogkrqMZO/Blgw0GH1L51GCDyUHlEyrvVEwOFWcqFe+oVFwNFipUXlGpWBlsMNhAIF6ouFL5VbFiB75ssMFgg8mJyn9V/JksVNyhcjbYYLDBZEHliclCxR0qZ4OLiqcGFypPTRZUnpgsVNyhcmYHvmywwQ8PTzQ4ee0K3AAAAABJRU5ErkJggg=='}
            }
    ocr.font.init(fontLib)
    text, info = ocr.font.ocr(0, 0, -1, -1)
    sys.log(text)
    sys.log(info)
end
注意:识字的时候返回是按照y从小到大,y相同的时候按照x从小到大的顺序来返回的.
如果同一行字体大小不一样的话返回的顺序可能会跟实际不符,可使用下面的代码重新排序
EAF565A4B38AA34B0BEB677BEFE54AA5.png
返回:i查ph找one
function main()
  fontLib = {
    {
      "查",
      {0xFFFFFF},
      90,
      "iVBORw0KGgoAAAANSUhEUgAAABEAAAASCAYAAAC9+TVUAAAAe0lEQVR4Aa3BAYrCMAAAwd2Q/395rwELIuHU2hk78IbKqeKVQPxoVuyo/KfiNNhQWSoqThUnldPghcpSsVNRsagsk4PKs4p3KlRUBOKh4orJoWJRuWJU/GqyUfEJlWVwg8mGyjcGN5hsVHxCZRncYLKh8o3Jk4orBjf4A9t+OSNeKN/qAAAAAElFTkSuQmCC"
    },
    {
      "找",
      {0xFFFFFF},
      90,
      "iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAYAAAACsSQRAAAAgUlEQVR4AZXBwQ2DMADAQDvK/iu7zQMJRZTCnX3xpbJUXFFZKnZT5UxlqXhqVqgcKu6o7CZfFSo7lX8qJi9V7CY3Kg4qvwwuqOwqrqgMNipPqSxDReWs4heV3WBT8YTKUjEqKt5QORu8UHFWsUweUjmrOEz+UPlncEPlrKJiUTl8AMfNQC63TMJ6AAAAAElFTkSuQmCC"
    },
    {
      "i",
      {0xFFFFFF},
      90,
      "iVBORw0KGgoAAAANSUhEUgAAAAcAAAAUCAYAAABBECfmAAAASklEQVR4AX3BwQnAMBADwZVI/y0rMfjgPtGM8uGHWSSxmUsShySGuZJwJGGYJQmbKUxhFklIYpjCFKYwhSlMYQpTmMIUpnhYkrC95TsQKek67QkAAAAASUVORK5CYII="
    },
    {
      "p",
      {0xFFFFFF},
      90,
      "iVBORw0KGgoAAAANSUhEUgAAAAoAAAARCAYAAADkIz3lAAAASElEQVR4AY3BQQ6AMBDDQG/U/3/ZqBLcgGZmAPmg8hhACoubypuZYQsHKlsohVIohVI4mBm2AaSwOFDZFjeVP6EUSqEUSqF0AZ1REhppas3gAAAAAElFTkSuQmCC"
    },
    {
      "h",
      {0xFFFFFF},
      90,
      "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAQCAYAAAArij59AAAASElEQVR4AYXBQQrAIAADwU3o/7+cKih4qM2MgAzcmMIUpjAfJLE9HCSxSWISEJYkbJKYzJKEUxImMyThxvxIgilMYQpTmMIULywAFBksRhEnAAAAAElFTkSuQmCC"
    },
    {
      "o",
      {0xFFFFFF},
      90,
      "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAPCAYAAADd/14OAAAAVUlEQVR4AY3BAQqAMBAEsZmj///y2kKFIiqXmImGoqloKj6onAYHlZPKbbCpLEk4qSzFpLIk4SkJS9GQhKKp2JLwp9hU/hRNRYNKMSVhUfkyeFB5cwGBFxYsDaQ/uQAAAABJRU5ErkJggg=="
    },
    {
      "n",
      {0xFFFFFF},
      90,
      "iVBORw0KGgoAAAANSUhEUgAAAAsAAAAMCAYAAAC0qUeeAAAASUlEQVR4AZXByQ0DQQwEseqG80+5PPMQsB8fIuPBB0lQGS+OJFwqVxJGEi6VeCRhqDwlYZQfVEZ5UPmmLJQ/qFxloSyUhbJQFt6DoB0Oyd3cJAAAAABJRU5ErkJggg=="
    },
    {
      "e",
      {0xFFFFFF},
      90,
      "iVBORw0KGgoAAAANSUhEUgAAAA4AAAAMCAYAAABSgIzaAAAAXklEQVR4AZ3BAQqDMADAwKT0/1/OVlCQ4sB5Z1/8oFJxZ7JRuVI5VZwmFypLxU5FpWIZvDQ4qCwVdyoWlWXw0mSj8sRkU/HE4KXBoeIfg43KHRWV0+CiYlFRWVRUdh9RZx8xNL+2lgAAAABJRU5ErkJggg=="
    }
  }

  ocr.font.init(fontLib)
  text, info = ocr.font.ocr(390, 360, 550, 400)
  sys.log(text)
  sys.log(sortByLine(info))
end

function sortByLine(info)
  table.sort(
    info,
    function(a, b)
      return a.x < b.x
    end
  )

  local text = ""
  for k, v in pairs(info) do
    text = text .. v.char
  end
  return text
end

image.png
重新排序后顺序和实际相符.

注意事项:

1.初始化字库运行一次即可,不用每次找字都初始化字库.
2.范围填写 0,0,-1,-1 可全屏查找.
3.只能识别初始化字库中的字.