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 。


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

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

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

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


下载地址:
2. Vis2
 

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

如何保存电子文件

2021-4-2 10:27:34

其他

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

2021-4-8 16:45:46

31 条回复 A文章作者 M管理员
  1. 宅小颜

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

  2. GreatMarx🚄

    空大佬牛逼

  3. user14414

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

  4. YllY

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

  5. LionAHK1

    第一个PaddleOCR 链接失效了.

    • 空

      没失效

  6. 〇〇13092

    👍

  7. 立心

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

  8. 立心

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

  9. zt7456

    厉害

  10. sanmaodo

    干的不能再干的干货💪💪💪

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

  12. dada大大

    厉害

  13. dbgba

    赞,在线OCR还是得留一份

  14. 爆发吧黄月英

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

    • 空

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

  15. maxs

    貌似qq截图更好用啊

    • 空

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

  16. 月下马

    下载地址找不到服务器😂

    • 空

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

  17. sanmaodo

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

  18. LionAHK1

    牛牛牛.

  19. 1河许人

    😁

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