识别模块
分类:本地图像识别
函数:ocr.tess.ocr() 本地图像识别
原函数名 : localOcrText
函数说明 : 将指定区域的图像识别成文字。
函数方法 : ocr.tess.ocr(路径 tess, 语言 lang?, 左上角坐标x?, 左上角坐标y?, 右下角坐标x?, 右下角坐标y?, 白名单 whitelist?);
返回值 : 文字 text 坐标数组 table
说明:使用该函数需要ocr语言包。
下载地址:https://share.weiyun.com/5wZtDSS
下载后, 将解压后的tessdata目录复制到设备中
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
| tess | string | 语言包tessdata目录的路径 | 必填 |
| lang | string | 语言类型 'eng' : 英文语言类型 'chi_sim' : 中文语言类型 | 非必填,默认 eng |
| ltx | number | 待识别区域的左上角X坐标 | 非必填,默认全屏识别 |
| lty | number | 待识别区域的左上角Y坐标 | 非必填,默认全屏识别 |
| rbx | number | 待识别区域的右下角X坐标 | 非必填,默认全屏识别 |
| rby | number | 待识别区域的右下角Y坐标 | 非必填,默认全屏识别 |
| whitelist | 文本型 | 设置白名单, 只有白名单中的字符才会被识别 | 非必填 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| text | string | 图片识别后得到的答案, 失败的话返回空字符串 |
| table | table | 返回的坐标等信息 |
返回的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目录复制到设备中
| 参数 | 类型 | 说明 |
|---|---|---|
| tess | string | 语言包tessdata目录的路径 |
| lang | string | 语言类型 'eng' : 英文语言类型 'chi_sim' : 中文语言类型 |
| whilelist | string | 设置白名单, 只有白名单中的字符才会被识别 |
| picpath1 | string | 待合并的第一个图片的路径 |
| picpath2 | string | 待合并的第二个图片的路径 |
| picpathn | string | 待合并的第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当需要识别的内容非常小识别不准确时(如下图的等级)可尝试下面方法

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.打开vscode的触摸精灵插件

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

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

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

如果字体有多种颜色,颜色之间用 , 分割 例如: 0xFFFFFF,0xAAAAAA,0x333333
5.点击添加,输入字键,点击字值框,然后框选数据,添加完成后点击生成字库
函数:ocr.font.init() 字库初始化
原函数名 : fontInit
函数说明 : 初始化字库/加载字库。
函数方法 : ocr.font.init(字库 lib);
返回值 : 无
| 参数 | 类型 | 说明 |
|---|---|---|
| lib | table | 字库数组 |
示例
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时)
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
| str | string | 要查找的字 | 必填 |
| ltx | number | 欲寻找的区域左上角的X坐标 | 非必填,默认全屏 |
| lty | number | 欲寻找的区域左上角的Y坐标 | 非必填,默认全屏 |
| rbx | number | 欲寻找的区域右下角的X坐标 | 非必填,默认全屏 |
| rby | number | 欲寻找的区域右下角的Y坐标 | 非必填,默认全屏 |
| fuzzy | number | 精度,范围:1 ~ 100,数值越大精度越高,100为完全匹配 | 非必填,默认100 |
| all | boolean | 是否返回所有符合条件的坐标 | 非必填,默认为false |
| 返回值 | 类型 | 说明 |
|---|---|---|
| x | number | 找到的坐标X值,未找到返回 -1 |
| y | number | 找到的坐标Y值,未找到返回 -1 |
| all为true的返回值 | 类型 | 说明 |
|---|---|---|
| table | table | 范围内找到的坐标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
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
| ltx | number | 欲识别的区域左上角的X坐标 | 非必填,默认全屏 |
| lty | number | 欲识别的区域左上角的Y坐标 | 非必填,默认全屏 |
| rbx | number | 欲识别的区域右下角的X坐标 | 非必填,默认全屏 |
| rby | number | 欲识别的区域右下角的Y坐标 | 非必填,默认全屏 |
| fuzzy | number | 精度,范围:1 ~ 100,数值越大精度越高,100为完全匹配 | 非必填,默认为100 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| text | string | 识别后得到的答案, 失败的话返回空字符串 |
| table | table | 返回的坐标等信息 |
返回的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从小到大的顺序来返回的.
如果同一行字体大小不一样的话返回的顺序可能会跟实际不符,可使用下面的代码重新排序
返回: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

重新排序后顺序和实际相符.
注意事项:
1.初始化字库运行一次即可,不用每次找字都初始化字库.
2.范围填写 0,0,-1,-1 可全屏查找.
3.只能识别初始化字库中的字.
分类:YOLO识别
YOLO文档地址:https://docs.ultralytics.com/zh/
示例下载地址:https://share.weiyun.com/GHFrnZCu
示例中的test.png为模型可识别的图片,可先用sys.album.addImage("/var/touchelf/test.png")将图片保存到相册中,打开图片再运行示例脚本测试
注意事项:
1.YOLO支持V5和V8版本.
2.yolo训练完是.pt格式的, 触摸接口需要是的ncnn格式(.param和.bin), 所以还要从.pt转为ncnn.
3.训练基本流程:先把所有图片标完, 再训练成yolo的.pt格式, 然后再用pnxx转成ncnn的.param和.bin
训练脚本示例:
from ultralytics import YOLO
# 1. 加载预训练模型权重 (建议从 n 版本开始,速度快,适合手机/端侧)
model = YOLO("yolov8n.pt")
# 2. 开始训练
results = model.train(
data="data.yaml", # 配置文件路径
epochs=100, # 训练轮次
imgsz=640, # 输入图像尺寸
batch=16, # 批处理大小
device="mps",
)这是导出ncnn脚本示例:
from ultralytics import YOLO
# 加载你训练好的模型
model = YOLO("runs/detect/train2/weights/best.pt")
# 导出为 ONNX (建议开启 simplify 以减少冗余算子)
model.export(format="ncnn", imgsz=640)函数:ocr.yolo.init() YOLO识别初始化
函数说明 : 初始化模型。
函数方法 : ocr.yolo.init(param, bin);
返回值 : boolean
适用版本:7.6.0以上
| 参数 | 类型 | 说明 |
|---|---|---|
| param | string | 模型param文件路径 |
| bin | string | 模型bin文件路径 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| param | boolean | 是否成功 |
示例
function main()
local wd = script.workingDir()
local model_path = wd .. "/res/model"
local ret = ocr.yolo.init(model_path .. "/yolov8n.param", model_path .. "/yolov8n.bin")
if not ret then
sys.log("YOLO初始化失败")
return
end
sys.log("YOLO初始化成功")
end函数:ocr.yolo.ocr() YOLO识别
函数说明 : 使用YOLO识别屏幕。
函数方法 : ocr.yolo.ocr(ltx, lty, rbx, rby);
返回值 : table 识别结果数组
适用版本:7.6.0以上
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
| ltx | number | 欲识别的区域左上角的X坐标 | 非必填,默认全屏 |
| lty | number | 欲识别的区域左上角的Y坐标 | 非必填,默认全屏 |
| rbx | number | 欲识别的区域右下角的X坐标 | 非必填,默认全屏 |
| rby | number | 欲识别的区域右下角的Y坐标 | 非必填,默认全屏 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| table | table | 识别结果数组 |
示例
function main()
local wd = script.workingDir()
local model_path = wd .. "/res/model"
local ret = ocr.yolo.init(model_path .. "/yolov8n.param", model_path .. "/yolov8n.bin")
if not ret then
sys.log("YOLO初始化失败")
return
end
sys.log("YOLO初始化成功")
-- COCO类别表
local COCO_CLASSES = {
"person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat",
"traffic light", "fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat",
"dog", "horse", "sheep", "cow", "elephant", "bear", "zebra", "giraffe", "backpack",
"umbrella", "handbag", "tie", "suitcase", "frisbee", "skis", "snowboard", "sports ball",
"kite", "baseball bat", "baseball glove", "skateboard", "surfboard", "tennis racket",
"bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple",
"sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair",
"couch", "potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote",
"keyboard", "cell phone", "microwave", "oven", "toaster", "sink", "refrigerator", "book",
"clock", "vase", "scissors", "teddy bear", "hair drier", "toothbrush"
}
local result = ocr.yolo.ocr()
sys.log(string.format("结果数量: %d", #result))
for i, v in ipairs(result) do
-- 将 label 从数字转换为 COCO 类别名
local label_name = COCO_CLASSES[v.label + 1] or tostring(v.label)
sys.log(string.format("检测到: %s, 位置: (%d, %d), 宽高: (%d, %d), 置信度: %.2f",
label_name, v.x, v.y, v.w, v.h, v.prob))
end
end
