实现文字识别后,可以与各种你喜欢的方式结合,例如鼠标手势、热键等等,效果如图。
1. PaddleOCR(离线)。
使用我封装的库 PaddleOCR-AutoHotkey
优点是效果好,可以离线识别。缺点是速度较慢,且老 CPU 无法使用。
完整打包一键运行版在文末下载。
简单示例如下。
; 识别本地图片
MsgBox, % PaddleOCR("test_zh.png")
; 识别网上图片(这里用的是百度的 logo )
MsgBox, % PaddleOCR("https://www.baidu.com/img/flexible/logo/pc/result.png")
; 根据坐标截屏并识别
MsgBox, % PaddleOCR([0,0,100,200])
; 识别一个程序界面(这里用的是记事本窗口)
MsgBox, % PaddleOCR("ahk_exe notepad.exe")
; 识别剪贴板
MsgBox, % PaddleOCR(ClipboardAll)
#Include PaddleOCR.ahk
2. Vis2(离线)。
使用 iseahound 的库 Vis2 (原理是谷歌的开源项目 tesseract )。
优点是可以离线识别,英文识别效果还凑合。缺点是中文效果不咋滴。
完整打包一键运行版在文末下载。
简单示例如下。
#include <Vis2> ; Equivalent to #include .libVis2.ahk
Tip=
(
识别中…… 耗时会很久,耐心等待。
原版的预处理已经被关掉了,因为对中文识别完全是负加成。
升级 tesseract 版本并不能提升识别效果。
改变 tesseract 参数也许可以提升识别效果。
官方文档说预处理图片可以提升识别效果,实测不明显。
打包了一个 PictureCleaner 用来手动预处理图片,慢慢试。
截图方式识别时使用的是快速模型,准确率较低。
提供图片路径时使用的是最佳模型,准确率更好。
)
Vis2.Graphics.Subtitle.Render(Tip, "t15000 xCenter y60% p1.35% c88EAB6 r8", "s2.23% cBlack")
Vis2.Graphics.Subtitle.Render("按 [Win] + [c] 可以截图识别。", "time: 30000 xCenter y92% p1.35% cFFB1AC r8", "c000000 s2.23%")
MsgBox % text := OCR("中文测试.png","chi_sim")
MsgBox % text := OCR("中文测试经过预处理.png","chi_sim")
#c:: OCR(,"chi_sim") ; 截图 OCR
#i:: ImageIdentify() ; 图片鉴别,也就是分辨图里是鱼还是橘子等
Esc:: ExitApp
3. 百度OCR(在线)。
使用 天黑请闭眼 的库 Class_bdocr (原理是百度的 OCR 接口)。
优点是识别效果比 PaddleOCR 略胜一筹,速度通常也更快。缺点是需要联网,需要开通百度 OCR 权限且免费次数有限(截止 2021.09.20 为每月 1000 次)。
完整打包一键运行版在文末下载。
简单示例如下。
API_KEY:="这里填自己的"
SECRET_KEY:="这里填自己的"
if (API_KEY="这里填自己的")
{
MsgBox 0x40010, , 照着教程先去 https://cloud.baidu.com/ 申请账号。
MsgBox 0x40010, , 需要库 Class_bdocr.ahk 和 JSON.ahk`n群文件或网上去搜。
ExitApp
}
ocr:=new bdocr(API_KEY, SECRET_KEY)
ret:=ocr.GetOcr(A_ScriptDir "\1.png","accurate_basic") ; 高精度识别
; ret:=ocr.GetOcr(pBitmap,"general_basic") ; 普通精度识别
for k,v in JSON.Load(ret).words_result
str.=v.words "`r`n"
MsgBox, % str
#Include Class_bdocr.ahk
#Include JSON.ahk
2.1 如何开通百度 OCR 权限。
1. https://cloud.baidu.com/ 首先在这里注册一个账号。
2. 照着下图一步一步做。
3. 代码中填入上一步得到的 API_KEY 和 SECRET_KEY 。
4. 现成的截屏带 OCR 工具。
使用 天黑请闭眼 的 截屏+百度OCR.ahk 。
在设置中填入自己的 API_KEY 和 SECRET_KEY ,然后按 F4 截屏。
完整打包一键运行版在文末下载。
?
牛牛牛.
@空 的帖子,都是精品?,感谢!
下载地址找不到服务器?
已修复。最近蓝奏云好像域名出了问题,官方发布的通告是,只要把lanzous改为lanzoux就可以正常访问。
貌似qq截图更好用啊
你要是有非手动调用qq截图并识别文字的方法,我也可以加在文章里面。
这个东西每次使用都要登录好百度的帐号么?
不需要,取得对应的key填入就可以了。
赞,在线OCR还是得留一份
厉害
PaddleOCR和百度OCR配合手势很好用,百度OCR加上&language_type=auto_detect可以识别多语言,PaddleOCR我是通过增加选项lang来识别多语言,直接抄model,识别其他语言时每次都要改选项,好麻烦,不会写代码好痛苦。
PaddleOCR 怎么识别多语言来着,详细说说。
https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.3/doc/doc_ch/models_list.md
https://gitee.com/paddlepaddle/PaddleOCR/blob/release/2.2/doc/doc_ch/models_list.md
原版是支持多语言识别的需要下载对应的识别模型和字典,检测模型可以通用
通过增加选项lang来识别多语言,直接抄model
修改的部分
static hModule, model, lang, get_all_info, LastConfigs, DllPath := A_LineFile “..Dll” ;修改的部分
; 支持的 Configs 选项
model := NonNull_Ret(Configs.model , model=”” ? “server” : model)
lang := NonNull_Ret(Configs.lang , lang=”” ? “ch” : lang) ;修改的部分
; 使用更快或更准的模型
model := (model=”fast” or model=”mobile”) ? “mobile” : “server”
lang := (lang=”ja” or lang=”ko” or lang=”cht”) ? lang : “ch” ;修改的部分
det_model_dir := DllPath “inferencech_ppocr_” model “_v2.0_det_infer”
cls_model_dir := DllPath “inferencech_ppocr_mobile_v2.0_cls_infer”
rec_model_dir := DllPath “inference” lang “_ppocr_” model “_v2.0_rec_infer” ;修改的部分
char_list_file := DllPath “inferenceppocr_keys_” lang “_v1.txt” ;修改的部分
在手势调用
;PaddleOCR
#Include %A_ScriptDir%AutoHotkeyPaddleOCRPaddleOCR2.ahk
SetWorkingDir %A_ScriptDir%
MsgBox, % PaddleOCR(Clipboard) ;识别中文
;MsgBox, % PaddleOCR(Clipboard,{“lang”:”jp”}) ;识别日文
;MsgBox, % PaddleOCR(Clipboard,{“lang”:”ko”}) ;识别韩文
;MsgBox, % PaddleOCR(Clipboard,{“lang”:”cht”}) ;识别繁体中文
多语言
https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.2/doc/doc_ch/multi_languages.md
https://gitee.com/PaddlePaddle/PaddleOCR/blob/release/2.2/doc/doc_ch/multi_languages.md
不是,我意思是,它能直接同时识别比如日文+繁体中文+西班牙语这样吗?
这个py版应该能实现,不过要自己训练模型和生成对应的字典。
直接使用多个识别模块和字典一起工作应该不行。
自己训练模型的话,ahk不也行么,模型放对应目录就好了。
当时写的时候就是考虑到它不能多模型联合使用,所以换模型意义不大,所以直接固定了目录。
等它自己支持联合使用再增加设置语言的选项吧。
干的不能再干的干货???
厉害
大大,我是个很新的新手,请教个问题:
我简单写了以下内容,试图鼠标直接框一个范围给ocr识别:
keyWait, LButton,down ;等待左键按下
MouseGetPos, X1, Y1
keyWait, LButton,up ;等待左键弹起
MouseGetPos, X2, Y2
MsgBox, % PaddleOCR([%X1%,%Y1%,%X2%,%Y2%]) ;传入坐标
#Include PaddleOCRPaddleOCR.ahk
但是会有“ImagePut.ahk 389行”的报错,请问为什么呀,这样传进去的坐标和直接写的坐标有区别吗
百分号去掉……
PaddleOCR([X1,Y1,X2,Y2])
好想改造一下那个“截图+百度OCR”,嫁接到PaddleOCR上,可惜看了一圈,不知道如何下手?
?
https://github.com/RapidAI/RapidOCR
这个有试过吗??是paddle的封装,可能对用户更友好??
第一个PaddleOCR 链接失效了.
没失效
可以问一下为什么我把「截屏带OCR工具」里的BDflag默认值设置为1时会提示「Access token invalid or no longer valid」吗?
我检查了几遍出现这个变量的地方,不知道哪里有问题,望赐教!
有个问题是,当百度OCR识别的文字有多行的时候,只返回最后一行。
空大佬牛逼
很棒的代码! 我这里想让它自动识别当前窗口, 并且返回指定文字的坐标, 请问应该怎么修改呢? 代码研究了好久, 还是搞不太懂..
我想用PaddleOCR 也下载了 VS2015 VS2017 但是还是用不了 我的CPU是 i5-10400 CPU 是因为CPU的问题吗? 还是说其他的问题?能否帮我解答一下
大佬,PaddleOCR 识别不了中文是漏了什么吗
没事了 感谢大佬分享,末尾的下载链接有多版本
感谢分享
感谢分享。试试效果。
👍感谢大佬分享,比心