AHK 实现文字识别(OCR) —— 离线与在线4种方法总结。

实现文字识别后,可以与各种你喜欢的方式结合,例如鼠标手势、热键等等,效果如图。

AHK 实现文字识别(OCR) —— 离线与在线4种方法总结。


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 。

  • AHK 实现文字识别(OCR) —— 离线与在线4种方法总结。
  • AHK 实现文字识别(OCR) —— 离线与在线4种方法总结。
  • AHK 实现文字识别(OCR) —— 离线与在线4种方法总结。
  • AHK 实现文字识别(OCR) —— 离线与在线4种方法总结。

4. 现成的截屏带 OCR 工具。

使用 天黑请闭眼 的 截屏+百度OCR.ahk 。

在设置中填入自己的 API_KEY 和 SECRET_KEY ,然后按 F4 截屏。

完整打包一键运行版在文末下载。


下载地址:
2. Vis2
 

给TA捐赠
共{{data.count}}人
人已捐赠
其他案例

滑块验证码的简单处理办法

2021-4-7 11:22:36

其他

RunWith —— 强制以管理员权限、普通权限、ANSI、U32、U64 运行自身。

2021-4-8 16:45:46

38 条回复 A文章作者 M管理员
  1. AHK中文社区

    ?

  2. LionAHK1

    牛牛牛.

  3. sanmaodo

    @空 的帖子,都是精品?,感谢!

  4. 月下马

    下载地址找不到服务器?

    • 空

      已修复。最近蓝奏云好像域名出了问题,官方发布的通告是,只要把lanzous改为lanzoux就可以正常访问。

  5. maxs

    貌似qq截图更好用啊

    • 空

      你要是有非手动调用qq截图并识别文字的方法,我也可以加在文章里面。

  6. 爆发吧黄月英

    这个东西每次使用都要登录好百度的帐号么?

    • 空

      不需要,取得对应的key填入就可以了。

  7. dbgba

    赞,在线OCR还是得留一份

  8. dada大大

    厉害

  9. illiatk

    PaddleOCR和百度OCR配合手势很好用,百度OCR加上&language_type=auto_detect可以识别多语言,PaddleOCR我是通过增加选项lang来识别多语言,直接抄model,识别其他语言时每次都要改选项,好麻烦,不会写代码好痛苦。

    • 空

      PaddleOCR 怎么识别多语言来着,详细说说。

    • illiatk

      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

    • 空

      不是,我意思是,它能直接同时识别比如日文+繁体中文+西班牙语这样吗?

    • illiatk

      这个py版应该能实现,不过要自己训练模型和生成对应的字典。
      直接使用多个识别模块和字典一起工作应该不行。

    • 空

      自己训练模型的话,ahk不也行么,模型放对应目录就好了。
      当时写的时候就是考虑到它不能多模型联合使用,所以换模型意义不大,所以直接固定了目录。
      等它自己支持联合使用再增加设置语言的选项吧。

  10. sanmaodo

    干的不能再干的干货???

  11. zt7456

    厉害

  12. 立心

    大大,我是个很新的新手,请教个问题:
    我简单写了以下内容,试图鼠标直接框一个范围给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])

  13. 立心

    好想改造一下那个“截图+百度OCR”,嫁接到PaddleOCR上,可惜看了一圈,不知道如何下手?

  14. 〇〇小猪

    ?

  15. LionAHK1

    第一个PaddleOCR 链接失效了.

    • 空

      没失效

  16. Y

    可以问一下为什么我把「截屏带OCR工具」里的BDflag默认值设置为1时会提示「Access token invalid or no longer valid」吗?
    我检查了几遍出现这个变量的地方,不知道哪里有问题,望赐教!

  17. user14414

    有个问题是,当百度OCR识别的文字有多行的时候,只返回最后一行。

  18. GreatMarx?

    空大佬牛逼

  19. 宅小颜

    很棒的代码! 我这里想让它自动识别当前窗口, 并且返回指定文字的坐标, 请问应该怎么修改呢? 代码研究了好久, 还是搞不太懂..

  20. user15733

    我想用PaddleOCR 也下载了 VS2015 VS2017 但是还是用不了 我的CPU是 i5-10400 CPU 是因为CPU的问题吗? 还是说其他的问题?能否帮我解答一下

  21. 醉梦年华

    大佬,PaddleOCR 识别不了中文是漏了什么吗

    • 醉梦年华

      没事了 感谢大佬分享,末尾的下载链接有多版本

  22. 岸上走

    感谢分享

  23. etomy

    感谢分享。试试效果。

  24. 橙子

    👍感谢大佬分享,比心

  25. dome

个人中心
购物车
优惠劵
有新私信 私信列表
搜索