懒人精灵的文字识别,大致有4种方法。
1、ocr光学识别
2、制作字库识别
3、内置 PP-OCR V4 模型识别(ONNX高精度 + NCNN低精度)
4、调用第三方apk插件识别

下面是调用懒人精灵高级版内置的PaddleOcr类进行识别(PP-OCR V4 模型)。
-- 导入必要的Java类库
import('java.io.File')
import('java.lang.*')
import('java.util.Arrays')
import('android.content.Context')
-- 导入NX Assist Lua扩展库
import('com.nx.assist.lua.LuaEngine')
import('com.nx.assist.lua.PaddleOcr')
-- 1. 加载OCR模型
local isModelLoaded = PaddleOcr.loadModel(true)
if not isModelLoaded then
print("Error: Failed to load PaddleOCR model")
return false
end
-- 2. 执行OCR识别(全屏识别,坐标参数为0,0,0,0)
local jsonResult = PaddleOcr.detect(0, 0, 0, 0)
if jsonResult == nil then
print("Warning: OCR detection returned no results")
return true -- 视为成功执行但无结果
end
-- 3. 解析JSON结果
local success, resultData = pcall(jsonLib.decode, jsonResult)
if not success or resultData == nil then
print("Error: Failed to parse OCR results JSON")
return false
end
-- 4. 输出格式化结果
if type(resultData) == "table" then
for index, item in ipairs(resultData) do
if type(item) == "table" and item.label and item.x and item.y then
print(string.format("OCR Result [%d]: Text='%s', Coordinates=(%d, %d)",
index, item.label, item.x, item.y))
else
print(string.format("Warning: Invalid data structure at index %d", index))
end
end
else
print("Warning: Unexpected OCR results format")
end
识别结果:
[11:01:27.220] [脚本/ocr.lua:734] OCR Result [1]: Text='游戏关系', Coordinates=(338, 36)
[11:01:27.221] [脚本/ocr.lua:734] OCR Result [2]: Text='QQ好友', Coordinates=(124, 154)
[11:01:27.221] [脚本/ocr.lua:734] OCR Result [3]: Text='鉴', Coordinates=(670, 158)
[11:01:27.221] [脚本/ocr.lua:734] OCR Result [4]: Text='招收徒弟,教导其成长的同时获得名师点,得到为人师表的尊', Coordinates=(951, 200)
[11:01:27.221] [脚本/ocr.lua:734] OCR Result [5]: Text='重,也是一种乐趣,同时你还将获得以下特权:', Coordinates=(950, 243)
[11:01:27.221] [脚本/ocr.lua:734] OCR Result [6]: Text='游戏好友', Coordinates=(122, 278)
[11:01:27.221] [脚本/ocr.lua:734] OCR Result [7]: Text='1、结算加成:和徒弟一起参加比赛,将获得额外的金币加成;', Coordinates=(951, 291)
[11:01:27.221] [脚本/ocr.lua:734] OCR Result [8]: Text='2、名师奖励:徒弟完成任务,你将获得名师点(可提升名师等级、获', Coordinates=(949, 330)
[11:01:27.221] [脚本/ocr.lua:734] OCR Result [9]: Text='得称号和奖励)', Coordinates=(952, 372)
[11:01:27.221] [脚本/ocr.lua:734] OCR Result [10]: Text='亲密关系', Coordinates=(121, 398)
[11:01:27.221] [脚本/ocr.lua:734] OCR Result [11]: Text='段位达荣耀黄金IV可收徒', Coordinates=(1018, 463)
[11:01:27.222] [脚本/ocr.lua:734] OCR Result [12]: Text='关注/粉丝', Coordinates=(118, 515)
[11:01:27.222] [脚本/ocr.lua:734] OCR Result [13]: Text='拜入一名师父门下,你可以更好的了解王者荣耀中的制胜技', Coordinates=(949, 530)
[11:01:27.222] [脚本/ocr.lua:734] OCR Result [14]: Text='00:00:00', Coordinates=(2013, 547)
[11:01:27.222] [脚本/ocr.lua:734] OCR Result [15]: Text='巧,同时,你还能拥有以下特权:', Coordinates=(952, 577)
[11:01:27.222] [脚本/ocr.lua:734] OCR Result [16]: Text='CPU架构:arm64-v8a', Coordinates=(2018, 589)
[11:01:27.222] [脚本/ocr.lua:734] OCR Result [17]: Text='屏幕分辨率:2248x108', Coordinates=(2019, 622)
[11:01:27.222] [脚本/ocr.lua:734] OCR Result [18]: Text='1、快速升级:和师父参加比赛,你将获得额外经验和金币加成;', Coordinates=(948, 619)
[11:01:27.222] [脚本/ocr.lua:734] OCR Result [19]: Text='找朋友', Coordinates=(137, 637)
[11:01:27.222] [脚本/ocr.lua:734] OCR Result [20]: Text='2、丰厚奖励:完成师徒任务,你将获得丰富的礼包;', Coordinates=(946, 660)
[11:01:27.222] [脚本/ocr.lua:734] OCR Result [21]: Text='3、出师谢礼:完成出师任务,你将获得出师大奖。', Coordinates=(948, 702)
[11:01:27.222] [脚本/ocr.lua:734] OCR Result [22]: Text='附近的人', Coordinates=(122, 759)
[11:01:27.222] [脚本/ocr.lua:734] OCR Result [23]: Text='拜师时,师父需比徒弟高一个段位', Coordinates=(1013, 843)
[11:01:27.223] [脚本/ocr.lua:734] OCR Result [24]: Text='友情重燃', Coordinates=(120, 879)
[11:01:27.223] [脚本/ocr.lua:734] OCR Result [25]: Text='拜师', Coordinates=(1978, 985)
[11:01:27.223] [脚本/ocr.lua:734] OCR Result [26]: Text='申请列表', Coordinates=(1694, 989)
[11:01:27.223] [脚本/ocr.lua:734] OCR Result [27]: Text='师徒', Coordinates=(152, 993)
[11:01:27.223] [脚本/ocr.lua:734] OCR Result [28]: Text='师徒任务', Coordinates=(501, 1027)
[11:01:27.224] [脚本/ocr.lua:734] OCR Result [29]: Text='名师特权', Coordinates=(335, 1028)
[11:01:27.240] [脚本/ocr.lua:455] 脚本正常结束了!!!
此外,懒人精灵高级版还有一个隐藏的接口:PaddleOcr.detect(bmp),可以传入bitmap图片进行识别。
-- 导入必要的Java类库
import('java.io.File')
import('java.lang.*')
import('java.util.Arrays')
import('android.content.Context')
-- 导入NX Assist Lua扩展库
import('com.nx.assist.lua.LuaEngine')
import('com.nx.assist.lua.PaddleOcr')
-- 1. 加载OCR模型
local isModelLoaded = PaddleOcr.loadModel(true)
if not isModelLoaded then
print("Error: Failed to load PaddleOCR model")
return false
end
-- 截图识别
local bmp = LuaEngine.snapShot(0,0,0,0)
-- local bmp = LuaEngine.snapShot(429,1879,650,1949)
local t = tickCount()
local jsonResult = PaddleOcr.detect(bmp)
print(tickCount() - t)
bmp.recycle()
print('识别结果: ' .. tostring(jsonResult))
识别结果:
[{"x":338,"y":36,"w":179,"h":49,"label":"游戏关系","prob":0.9876143336296082},{"x":124,"y":154,"w":142,"h":49,"label":"QQ好友","prob":0.9920676350593567},{"x":670,"y":158,"w":139,"h":206,"label":"鉴","prob":0.9902114272117615},{"x":951,"y":200,"w":878,"h":35,"label":"招收徒弟,教导其成长的同时获得名师点,得到为人师表的尊","prob":0.9912757277488708},{"x":950,"y":243,"w":671,"h":38,"label":"重,也是一种乐趣,同时你还将获得以下特权:","prob":0.9830138087272644},{"x":122,"y":278,"w":149,"h":43,"label":"游戏好友","prob":0.9876487851142883},{"x":951,"y":291,"w":790,"h":31,"label":"1、结算加成:和徒弟一起参加比赛,将获得额外的金币加成;","prob":0.9827877879142761},{"x":949,"y":330,"w":881,"h":35,"label":"2、名师奖励:徒弟完成任务,你将获得名师点(可提升名师等级、获","prob":0.9929959177970886},{"x":952,"y":372,"w":188,"h":33,"label":"得称号和奖励)","prob":0.9848448038101196},{"x":121,"y":398,"w":148,"h":44,"label":"亲密关系","prob":0.9886061549186707},{"x":1018,"y":463,"w":291,"h":31,"label":"段位达荣耀黄金IV可收徒","prob":0.9927527904510498},{"x":118,"y":515,"w":151,"h":42,"label":"关注\/粉丝","prob":0.9860033988952637},{"x":949,"y":530,"w":848,"h":38,"label":"拜入一名师父门下,你可以更好的了解王者荣耀中的制胜技","prob":0.9877855181694031},{"x":2013,"y":547,"w":109,"h":33,"label":"00:00:00","prob":0.9829228520393372},{"x":952,"y":577,"w":471,"h":35,"label":"巧,同时,你还能拥有以下特权:","prob":0.9950840473175049},{"x":2018,"y":589,"w":231,"h":33,"label":"CPU架构:arm64-v8a","prob":0.9817960262298584},{"x":2019,"y":622,"w":231,"h":28,"label":"屏幕分辨率:2248x108","prob":0.980475127696991},{"x":948,"y":619,"w":824,"h":37,"label":"1、快速升级:和师父参加比赛,你将获得额外经验和金币加成;","prob":0.9877049326896667},{"x":137,"y":637,"w":117,"h":47,"label":"找朋友","prob":0.9908058643341064},{"x":946,"y":660,"w":683,"h":38,"label":"2、丰厚奖励:完成师徒任务,你将获得丰富的礼包;","prob":0.9865456223487854},{"x":948,"y":702,"w":650,"h":35,"label":"3、出师谢礼:完成出师任务,你将获得出师大奖。","prob":0.9942134022712708},{"x":122,"y":759,"w":147,"h":43,"label":"附近的人","prob":0.990208089351654},{"x":1013,"y":843,"w":397,"h":32,"label":"拜师时,师父需比徒弟高一个段位","prob":0.9913244843482971},{"x":120,"y":879,"w":152,"h":43,"label":"友情重燃","prob":0.9863091111183167},{"x":1978,"y":985,"w":87,"h":50,"label":"拜师","prob":0.9891083240509033},{"x":1694,"y":989,"w":154,"h":43,"label":"申请列表","prob":0.9955143928527832},{"x":152,"y":993,"w":86,"h":52,"label":"师徒","prob":0.9912915229797363},{"x":501,"y":1027,"w":121,"h":37,"label":"师徒任务","prob":0.9935110807418823},{"x":335,"y":1028,"w":122,"h":36,"label":"名师特权","prob":0.9927045702934265}]
百度飞桨OCR识字:
import('java.io.File')
import('java.lang.*')
import('java.util.Arrays')
import("java.util.regex.*")
import('android.content.Context')
import('android.hardware.Sensor')
import('android.hardware.SensorEvent')
import('android.hardware.SensorEventListener')
import('android.hardware.SensorManager')
import('com.nx.assist.lua.LuaEngine')
import('com.nx.assist.lua.PaddleOcr')
function 网络_飞桨加载模型(...)
local 飞桨参数 = {...}
if type(飞桨参数[1]) == "boolean" then--加载懒人内置模型
return PaddleOcr.loadModel(飞桨参数[1])
elseif utf8.mid(飞桨参数[1],#飞桨参数[1]-4,5) == ".onnx" then --加载自己训练外置onnx模型
return PaddleOcr.loadOnnxModel(飞桨参数[1],飞桨参数[2],飞桨参数[3],飞桨参数[4])
else--加载自己训练外置ncnn模型
return PaddleOcr.loadNnccModel(飞桨参数[1],飞桨参数[2],飞桨参数[3],飞桨参数[4],飞桨参数[5])
end
end
local function 飞桨识别(x1,y1,x2,y2,近似度)
local 位图对象 = LuaEngine.snapShot(x1,y1,x2,y2)
local 近似度,行列分割,上次对象 = 近似度 or 0 ,{},{y=0}
local 识别结果 = jsonLib.decode(PaddleOcr.detect(位图对象))
LuaEngine.releaseBmp(位图对象)
table.sort(识别结果,function (k1,k2) return k1.y < k2.y end)
for _, v in pairs(识别结果) do
if v.prob >= 近似度 then
if math.abs(v.y - 上次对象.y ) > 5 or not 行列分割[#行列分割] then
table.insert(行列分割,{v})
else
table.insert(行列分割[#行列分割],v)
end
上次对象 = v
end
end
for i=1,#行列分割 do
table.sort(行列分割[i],function (k1,k2) return k1.x < k2.x end)
end
return 行列分割
end
function 网络_飞桨识别文字(x1,y1,x2,y2,近似度)--识别成功返回从上到下,从左到右排版好的文字结果,失败返回nil
local 飞桨结果 = 飞桨识别(x1,y1,x2,y2,近似度)
for 键名, 键值 in pairs(飞桨结果) do
for 键, 值 in pairs(键值) do
飞桨结果[键名][键] = 值.label
end
飞桨结果[键名] = table.concat(飞桨结果[键名]," ")
end
return table.concat(飞桨结果,"\n")
end
function 网络_飞桨识别EX(x1,y1,x2,y2,近似度)--返回识别的全部文字信息与坐标
local 飞桨结果,返回列表 = 飞桨识别(x1,y1,x2,y2,近似度),{}
for _, 键值 in pairs(飞桨结果) do
for _, 值 in pairs(键值) do
值.x,值.y = 值.x + x1 ,值.y + y1
table.insert(返回列表,值)
end
end
return #返回列表 > 0 and 返回列表 or nil
end
function 网络_飞桨找字EX(x1,y1,x2,y2,寻找文字,近似度,全部坐标)--根据提供的文字参数进行找字,支持多组文字,例如"懒人|精灵",全部坐标填写true返回数组
local 飞桨结果,过滤列表 = 飞桨识别(x1,y1,x2,y2,近似度),{}
print("飞桨识别结果",飞桨结果)
for _, 键值 in pairs(飞桨结果) do
for _, 值 in pairs(键值) do
if Pattern.compile(寻找文字).matcher(值.label).find() then
local x,y,w,h = 值.x + x1-1 , 值.y + y1-1 , 值.w ,值.h
local 正则,长度 = Pattern.compile(寻找文字).matcher(值.label),w/#值.label
while 正则.find() do
local 匹配文字 = 正则.group()
local 字x,字y,字w,字h = math.floor(x + (值.label:find(匹配文字,1,true)-1)*长度),y,math.floor(#匹配文字*长度),h
if 全部坐标 ~= true then
return 字x,字y,字w,字h
else
table.insert(过滤列表,{label = 匹配文字 ,x = 字x ,y = 字y ,w = 字w,h = 字h,prob = k.prob})
end
end
end
end
end
return #过滤列表 > 0 and 过滤列表 or nil
end
function 飞桨找字定位(x1, y1, x2, y2, keyword, 近似度)
近似度 = 近似度 or 0.5
local results = 网络_飞桨识别EX(x1, y1, x2, y2, 近似度)
if not results then
print("提示: 未识别到任何文字")
return nil
end
for _, item in ipairs(results) do
if item.label == keyword then
local centerX = item.x + item.w / 2
local centerY = item.y + item.h / 2
print("飞桨找到「" .. keyword .. "」中心坐标: (" .. centerX .. ", " .. centerY .. ")")
return { text = item.label, x = centerX, y = centerY }
end
end
print("提示: 未找到文字「" .. keyword .. "」")
return nil
end
-- 网络_飞桨加载模型(true)
-- local 识别结果 = 网络_飞桨识别文字(0,0,0,0,0.2)
-- print(识别结果)
-- local 文字列表= 网络_飞桨识别EX(0,0,0,0,0.2)
-- print(文字列表)
-- local x,y,宽,高 = 网络_飞桨找字EX(0,0,0,0,"懒人|高级",0.2)
-- print(x,y,宽,高)
1. 官方交流QQ群,添加多个不批。建议使用安卓手机或电脑申请。
飞云脚本圈: 586333520
Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » 【懒人精灵】PaddleOcr文字识别示例
飞云脚本圈: 586333520

Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » 【懒人精灵】PaddleOcr文字识别示例