cover_image

简单编程调用微信 OCR 识别图像文本

Python成长路 2024年04月12日 02:27

先声明一下:
本文提供的代码是为了学习与研究编程技术
,勿作其他任何不当用途。

今天偶然在 GitHub 看到一个不错的开源项目:

C++ 版: github.com/EEEEhex/QQImpl 
Python 版: github.com/kanadeblisst00/wechat_ocr


可以调用微信 OCR 。

于是用纯 aardio 代码翻译了一下创建了 process.wxOcr 扩展库。扩展库源码的一些技术要点我都写了注释,大家可以看看。

用法很简单。

我们只要下载几 MB 的极简开发环境 aardio 。

新建工程,复制下面的代码粘贴到 main.aardio :

//创建窗口
import win.ui;
var winform = win.form(text="测试 OCR")
winform.add(
edit={cls="edit";marginLeft=1;marginTop=1;marginRight=1;marginBottom=1;multiline=1}
)

//导入 OCR 扩展库
import process.wxOcr; 

//创建 OCR 对象
var ocr = process.wxOcr(); 

//识别文本
ocr.sendRquest("D:\testocr.jpg",

    //最后一个参数指定一个函数异步接收识别结果
    function(mmojoOcrResponse){ 
        
        //识别结果
        var result = mmojoOcrResponse.ocrResult.singleResult;
        
        //逐行输出文本
        for(k,line in result){
            winform.edit.print(line.singleStrUtf8) 
        }  
    }
)

//显示窗口
winform.show();
win.loopMessage();


点击『保存 Ctrl +S』按钮:

图片

按『运行 F5 』按钮看效果,按 F7 一键生成独立 EXE 文件。

下面再增加一点难度。

添加一个截屏选区转文本的功能:

import win.ui;
/*DSG{{*/
var winform = win.form(text="调用微信 OCR";left=-2;top=-2;right=323;bottom=382;topmost=1)
winform.add(
btnOcr={cls="button";text="提取图像文本";left=150;top=341;right=308;bottom=376;db=1;dl=1;dr=1;z=2};
edit={cls="edit";left=9;top=6;right=314;bottom=335;db=1;dl=1;dr=1;dt=1;edge=1;hscroll=1;multiline=1;vscroll=1;z=1}
)
/*}}*/

import process.wxOcr; 
var ocr = process.wxOcr(); 
if(!ocr) error("系统未安装微信");

//按钮事件
winform.btnOcr.oncommand = function(id,event){
    
    //屏幕选区
    import mouse.screenArea;
    var screenArea = mouse.screenArea();
    
    //保存屏幕选区
    screenArea.onSelectionChanged = function(rc){
        
        import gdip.snap;
        var bmp = gdip.snap(screenArea.hwnd,rc.xywh());
        bmp.save("/~~~~ocr.jpg",80);
        owner.close();
    }
    screenArea.doModal();

    //识别文本
    ocr.sendRquest("/~~~~ocr.jpg",
        function(mmojoOcrResponse){ 
            
            //识别结果
            var singleResult = mmojoOcrResponse.ocrResult.singleResult;
            
            //逐行输出到文本框
            for(k,ret in singleResult){
                winform.edit.print(ret.singleStrUtf8)
            }  
        }
    )   
}

//显示窗口
winform.show();
win.loopMessage();


运行效果如下:

图片

注意识别结果里的 mmojoOcrResponse 是一个 protobuf.message 对象,aardio 里的 protobuf 消息对象是直接兼容 JSON 的,不需要写任何代码,可以直接用下面的代码转换为 JSON 。

web.json.stringify(mmojoOcrResponse)


或者用下面的代码转换为纯表对象:

web.json.strip(mmojoOcrResponse)


当然,直接用 mmojoOcrResponse  也很方便。

其实 aardio 中提供了不少 OCR 的扩展库,例如: string.ocrLite, dotNet.ocr ,tesseract 等利用 aardio 提供的 web.rest 调用各种在线 OCR 接口也很方便,基本不需要额外去封装扩展库。

继续滑动看下一个
Python成长路
向上滑动看下一个