Python调用微信OCR识别文字和坐标

这篇具有很好参考价值的文章主要介绍了Python调用微信OCR识别文字和坐标。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原理

在看雪看到一篇文章:逆向调用QQ截图NT与WeChatOCR-软件逆向。里面说了怎么调用微信和QQ本地的OCR模型,还有很详细的分析过程。

我稍微看了下文章,多的也看不懂。大概流程是使用mmmojo.dll这个dll来与WeChatOCR.exe做通信的,也是用它来启动和关闭WeChatOCR.exe进程的。所以关键只需要知道这个dll里的导出函数怎么使用,就能自己实现调用OCR。并且可以脱离微信,不需要启动微信就能调用。既然这样,那完全可以使用Python加载mmmojo.dll启动WeChatOCR.exe并和它通信进行OCR识别。

代码怎么实现的就不多说的,感兴趣的可以看github的源码。我就说下有意思的一个技巧和一个踩坑的地方

回调指针技巧

OCR识别成功完成后会调用你给定的回调函数,并将结果作为参数传给回调函数。而其中一个回调函数的原型是static void OCRRemoteOnConnect(bool is_connected, void* user_data);。第一个参数是当前连接状态,比较有意思的是第二个参数


第二个参数是你给定的一个指针,它可以通过SetMMMojoEnvironmentCallbacks这个导出函数来设置,然后你就可以在回调函数里访问到这个指针。这个有什么用呢?就以上面github里的C++代码为例,代码里是将它设置为类的this指针,然后在建立连接后调用OCRRemoteOnConnect回调函数时,通过这个this指针改变类变量m_connect_con_var,然后你才能调用DoOCRTask,如果m_connect_con_var变量没有被设置,说明没有连接成功,就一直等待。


搜了一下,在Python里也可以实现这样一个操作,把这个值设置成Python类对象,然后就可以在回调函数访问这个类对象。原理大概像这篇文章:python - Back-casting a ctypes.py_object in a callback - Stack Overflow。先使用ctypes.py_object将对象转化为一个PyObject指针传给c层,然后在回调函数里再通过ctypes.cast(context, py_object).value得到这个对象,在这个项目里的代码如下:

# 将self转为c指针设置成user_data
SetMMMojoEnvironmentCallbacks(m_mmmojo_env_ptr, 0, py_object(self))
# 在回调函数里使用它
def OCRRemoteOnConnect(is_connected:c_bool, user_data:py_object):
    print(f"OCRRemoteOnConnect 回调函数被调用, 参数, is_connected: {is_connected}")
    if user_data:
        manager_obj:OcrManager = cast(user_data, py_object).value
        manager_obj.SetConnectState(True)

踩坑

调用dll时的参数不能直接用c_wchar_p,需要先赋值给一个变量,不然会被垃圾回收机制给回收了。而且错误很难定位,不会报错,程序直接终止

# 错误代码
SetMMMojoEnvironmentInitParams(m_mmmojo_env_ptr, 2, c_wchar_p(m_exe_path))
# 正确代码
c_m_exe_path = c_wchar_p(m_exe_path)
SetMMMojoEnvironmentInitParams(m_mmmojo_env_ptr, 2, c_m_exe_path)

另外还要注意的它的生命周期,和使用的时间。有些使用比较久的,你还得定义成全局变量或者赋值给self.

如何使用

安装

我已经发布到了pypi上,可以使用pip安装:pip install wechat-ocr

如果使用的是国内源,可能还没有更新,可以使用pip install wechat-ocr -i https://pypi.org/simple来使用官方源安装

使用

import os
import json
import time
from wechat_ocr.ocr_manager import OcrManager, OCR_MAX_TASK_ID


wechat_ocr_dir = "C:\\Users\\Administrator\\AppData\\Roaming\\Tencent\\WeChat\\XPlugin\\Plugins\\WeChatOCR\\7057\\extracted\\WeChatOCR.exe"
wechat_dir = "D:\\GreenSoftware\\WeChat\\3.9.6.32"

def ocr_result_callback(img_path:str, results:dict):
    result_file = os.path.basename(img_path) + ".json"
    print(f"识别成功,img_path: {img_path}, result_file: {result_file}")
    with open(result_file, 'w', encoding='utf-8') as f:
       f.write(json.dumps(results, ensure_ascii=False, indent=2))

def main():
    ocr_manager = OcrManager(wechat_dir)
    # 设置WeChatOcr目录
    ocr_manager.SetExePath(wechat_ocr_dir)
    # 设置微信所在路径
    ocr_manager.SetUsrLibDir(wechat_dir)
    # 设置ocr识别结果的回调函数
    ocr_manager.SetOcrResultCallback(ocr_result_callback)
    # 启动ocr服务
    ocr_manager.StartWeChatOCR()
    # 开始识别图片
    ocr_manager.DoOCRTask(r"T:\Code\WeChat\OCR\Python\img\1.png")
    ocr_manager.DoOCRTask(r"T:\Code\WeChat\OCR\Python\img\2.png")
    ocr_manager.DoOCRTask(r"T:\Code\WeChat\OCR\Python\img\3.png")
    time.sleep(1)
    while ocr_manager.m_task_id.qsize() != OCR_MAX_TASK_ID:
        pass
    # 识别输出结果
    ocr_manager.KillWeChatOCR()
    

if __name__ == "__main__":
    main()

运行结果:

源码仓库

https://github.com/kanadeblisst00/wechat_ocr

aardio版本

aardio作者也实现了一个aardio版本:https://mp.weixin.qq.com/s/kYGGyjKW-GJxlqGkmQfuBg

本文由博客一文多发平台 OpenWrite 发布!文章来源地址https://www.toymoban.com/news/detail-852587.html

到了这里,关于Python调用微信OCR识别文字和坐标的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python之OCR文字识别

    将图片翻译成文字一般被称为光学文字识别(Optical Character Recognition,OCR)。可以实现OCR 的底层库并不多,目前很多库都是使用共同的几个底层OCR 库,或者是在上面进行定制。 easyocr是基于torch的深度学习模块 easyocr安装后调用过程中出现opencv版本不兼容问题,所以放弃此方案

    2024年02月20日
    浏览(40)
  • Python实现OCR文字识别

    OCR(Optical Character Recognition,光学字符识别)是指通过扫描纸质文档或照片,通过计算机对图像记录的文字进行识别的一种技术。本文介绍如何使用Python来实现OCR文字识别技术。 要实现Python的OCR文字识别,首先需要安装OCR软件和相关的包依赖,比如pytesseract和OpenCV。 安装pyt

    2024年02月16日
    浏览(38)
  • Python制作简易OCR文字识别系统

    前不久看了一篇“如何使用Python检测和识别车牌?”用OpenCV对输入图像进行预处理,用imutils将原始输入图像裁剪成所需的大小,用pytesseract将提取车牌字符转换成字符串(车牌识别)。 但经实测,美式车牌识别基本正确,但中国92式车牌、新能源车牌识别基本失败,失败的现象

    2024年02月08日
    浏览(49)
  • 通用文字识别 本地OCR接口 json数据 任意语言 不限次调用 exe服务工具免搭建部署启动即用

    在这里插入图片描述 样本识别效果: 使用方法: 启动本地OCR接口服务 图片文件=base64编码=转json格式=传到对应接口 本地OCR程序: 文件太大没法传,要会员,我刚删掉了一个复杂模型,能用上得再问我要把。微:huang582716403

    2024年02月11日
    浏览(60)
  • 如何使用Python实现图像文字识别OCR

    要使用Python实现图像文字识别OCR,可以使用以下步骤: 安装Tesseract OCR引擎 Tesseract是一种开源OCR引擎,可以处理多种语言和字体。要使用Python进行OCR,需要安装Tesseract OCR引擎。安装方法可以在Tesseract的官方网站上找到。 安装Python模块 要使用Python进行OCR,需要安装Python模块。

    2024年02月04日
    浏览(71)
  • python ocr(光学文字识别) 学习笔记 (一)

    参考资料:500 lines or less ocr 我们的OCR系统主要由5部分组成,分别写在5个文件之中。它们分别是: 客户端(ocr.js) 服务器(server.py) 简单的用户界面(ocr.html) 基于反向传播训练的ANN(ocr.py) ANN的实现脚本(neural network design.py) 虽然界面服务器用户界面不是我们的重点,但由于笔者水平有

    2024年02月08日
    浏览(45)
  • 【Python第三方包】ocr文字识别(pyocr)

    2023年10月30日
    浏览(53)
  • Python - OpenCV、OCR识别摄像头中的文字

    使用Python3的OpenCV库来识别摄像头中的文字,以及使用OCR(光学字符识别)技术。 安装OpenCV库 在命令行中输入以下命令来安装OpenCV库: 安装Tesseract OCR库 Tesseract OCR库是一种免费的光学字符识别库,它可以识别多种语言的文字。您可以在命令行中使用以下命令来安装它: 打开

    2024年02月15日
    浏览(73)
  • 100天精通Python(实用脚本篇)——第113天:基于Tesseract-OCR实现OCR图片文字识别实战

    🔥🔥 本文已收录于 《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整教学,从0到100的不断进阶深入,后续还有实战项目,轻松应对面试,专栏订阅地址:https://blog.csdn.net/yuan2019035055/category_11466020.html 优点 : 订阅限时9.9付费专

    2024年01月22日
    浏览(56)
  • Python实现OCR大批量识别图片文字,并将文字保存到txt文档中,文末源码直接拿!

    在当今数字化时代,图像文字识别(Optical Character Recognition, OCR)技术的应用越来越广泛。 OCR技术可以将印刷体文字转化为可编辑的文本格式,从而方便进行文本分析、数据挖掘等操作。Python作为一种简洁、易用的编程语言,提供了丰富的图像处理和机器学习库,使得实现图

    2024年02月15日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包