按键精灵免字库识别—基于百度飞桨PaddleOCR的RapidOCR
前言
目前网上仅有类大漠的字库识别和远程调用互联网识别。百度飞桨很早就开源了PaddleOCR,做一个小脚本还使用收费远程项目早应该过时。由于对py不熟悉,推理麻烦,直接使用了捷智开源的基于PaddleOCR的RapidOCR,简单快捷。
为什么
为什么有大漠了还要使用其它OCR
大漠OCR确实是经典永流传,它的优点就是非常的快,个位数毫秒级别,完美适用是实时高频率调用的脚本。当然快速也就意味着简单,它的识字是要做字库的,只适用于已知文库,我认为其实就是相当于特殊识图,伪OCR。人工智能快速发展,才有了真正的OCR,也就是免字库OCR。百度也是承担起国内人工智能发展的社会责任,开源了PaddleOCR,遵守Apache协议,可以商用。
为什么要使用RapidOCR
大漠 =》需要字库,个位数毫秒级
远程OCR =》免费受限制、网络传输耗时,百位数毫秒级
PaddleOCR =》 推导,需要一定的python开发经验,未知
RapidOCR =》成品,本地搭建调用即可,当然定制化优化性能更好,十位数毫秒级。
开发
有了这么优秀的产品,就可以尝试整合了。
PaddleOCR介绍
https://github.com/PaddlePaddle/PaddleOCR/
PaddleOCR使用
PaddleOCR如上,有各种语言的应用推导。记录一下我使用过的几种。
衍生项目版——小白方案
衍生项目使用易语言编写的,无需依赖环境,双击即可启动,小白也能用。
点开接口测试,都已经写好调用案例了。
按键精灵post调用
关于按键精灵http请求调用接口的代码,B站酷玩蚊仔已经封装好,我直接借鉴了,需要做些调整。
酷玩蚊仔
https://www.bilibili.com/video/av556250543/?vd_source=8a1fa4f94facedbbcdd82d30f1ef1a10
给出我做的调整的代码
图片转base64方法
注释掉替换加号,这应该是百度在线api需要的格式。
FunctionImagesToBase64(FilePath)Dim xml
Dim root
Dim fs
Dim objStream
Dim objXMLDoc
DimBase64Set objXMLDoc =CreateObject("Microsoft.XMLDOM")// 可以访问和操作XML文档
objXMLDoc.loadXML "<?xml version='1.0' ?><data></data>"// 导入指定字符串的XML文档Set fs =createObject("Scripting.FileSystemObject")// 可以操作磁盘、文件夹或文本文件Iffs.FileExists(FilePath)Then// 判断文件是否存在
'用 stream 来读取数据
Set objStream =CreateObject("ADODB.Stream")// 可以存取二进制数据或者文本流objStream.Type=1// 表示二进制数据objStream.Open// 打开objStreamobjStream.LoadFromFileFilePath// 加载文件数据(下载图片用SaveToFile)
objXMLDoc.documentElement.dataType ="bin.base64"// 设置节点数据类型
objXMLDoc.documentElement.nodeTypedvalue =objStream.Read// 从objStream读取,再存储到根节点(objXMLDoc.documentElement代表XML文档的根节点)
'数据流读取结束.得到了值 objXMLDoc
'创建XML文件
Set xml =CreateObject("Microsoft.XMLDOM")
xml.load objXMLDoc // 导入指定位置的XML文档Ifxml.ReadyState>2Then// 0:未初始化;1:载入;2:载入完成;3:交互;4:完成Set root = xml.getElementsByTagName("data")// 返回指定名字的节点集合(可能会有多个重名节点)Base64=root(0).Text
Base64=Replace(Base64, vbLf,"")// 去除换行(vbLf相当于chr(10))(可以不去除)// Base64 = Replace(Base64,"+","%2B") // 替换加号(文档未说明,但需要此操作,而且不要进行urlencode)ElseBase64=""EndIfSet xml =NothingSet objStream =NothingElse// 文件不存在Base64=""EndIfSet fs =NothingSet objXMLDoc =NothingImagesToBase64="data:image/png;base64,"&Base64// //TracePrint ImagesToBase64EndFunction
转json方法
FunctionjsonFormatter(str)
result ="{"
attrList =split(str,"&")For i =0ToUBound(attrList)If i >0Then
result = result &","EndIf
attr =attrList(i)
key =split(attr,"=")(0)
value =split(attr,"=")(1)
result = result &chr(34)& key &chr(34)&":"&chr(34)& value &chr(34)Next
result = result &"}"TracePrint result
jsonFormatter = result
EndFunction
post调用
imgBase64 =ImagesToBase64("E:\python\ocr\2.png")Set xPost =CreateObject("Msxml2.ServerXMLHTTP.3.0")xPost.Open"Post","http://127.0.0.1:9003/ocr",False
xPost.setRequestHeader "CONTENT-TYPE","application/json"xPost.Send(jsonFormatter("file="& imgBase64))If xPost.readyState =4ThenTracePrint xPost.responsetext
// Set obj = json.Decode(xPost.responsetext)// TracePrint obj("Msg")// access_token = obj("access_token")EndIf
JVM版
作为Java开发,反而在搞Java Demo时耗时最长。
改为maven
给出的案例是grade版,改为java开发熟悉的maven版,移植代码
maven应该只需要加这个以支持kotlin
<dependency><groupId>org.jetbrains.kotlin</groupId><artifactId>kotlin-stdlib</artifactId></dependency>
OcrEngine路径
OcrEngine 全类名不能改动,否则会报错遇坑
Java调用jni的一个坑-java.lang.UnsatisfiedLinkError ()Ljava/lang/String
======= https://blog.csdn.net/qq_24054301/article/details/128653326
idea Run配置
需要配置参数,github有详细讲解
网页版【推荐】
Web版启动也非常简单,不过代码是用python写的,按文档走就行了,pip需要使用源外,没有其它坑,也是非常简单,而且速度比易语言版更快,更是可以修改代码,定制格式化。
注意:不要使用api版,好像有问题,直接用网页版,然后f12查看请求,更快。
第一次优化-简化结果
http请求返回值json简化
修改返回值,简化结果,免去两端格式化
returnstr(rec_res_data).split(',')[1]
第二次优化-免base64传输
原方案都是基于cs或bs架构,但是本地调用文件都在本地,没必要转码和文件传输。
所以直接在python里读取图片文件不要传输更快。
image = cv2.imread("E:\python\ocr\screen.bmp")
最后
抓图还是得使用大漠,效率比python的抓图性能好。如果能找到高效抓图的py库那自然是最好的,可以免去文件存储和读取的io耗时。
版权归原作者 bbq烤鸡 所有, 如有侵权,请联系我们删除。