当前位置: 首页 > news >正文

C#调用WechatOCR.exe实现本地OCR文字识别

最近遇到一个需求:有大量的扫描件需要还原为可编辑的文本,很显然需要用到图片OCR识别为文字技术。本来以为这个技术很普遍的,结果用了几个开源库,效果不理想。后来,用了取巧的方法,直接使用了WX的OCR识别模型,因为发现WX电脑端的OCR识别真是黑科技啊,好用的很!识别率99.9%,并且是本地识别,不需要调用接口。放几张图片看看,中文识别很强!图片里很多干扰因素都自动屏蔽了,厉害!

简单用C# + winforms实现了一下:

public class ImageOcr
{public static void Run(string imagePath, Action<string,WeiOcrResult> callback){string wechatOcrDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"extracted\WeChatOCR.exe");string wechatDir = AppDomain.CurrentDomain.BaseDirectory;OcrManager? ocrManager = new OcrManager();var ocrPtr= GCHandle.ToIntPtr(GCHandle.Alloc(ocrManager));ocrManager = GCHandle.FromIntPtr(ocrPtr).Target as OcrManager;if (ocrManager != null){ocrManager.SetExePath(wechatOcrDir);ocrManager.SetUsrLibDir(wechatDir);ocrManager.SetOcrResultCallback(callback);ocrManager.StartWeChatOCR(ocrPtr);ocrManager.DoOCRTask(imagePath);Thread.Sleep(1000);while (ocrManager.m_taskIdQueue.Count != OcrManager.OCR_MAX_TASK_ID){// Wait for OCR tasks to completeThread.Sleep(100);}ocrManager.KillWeChatOCR();}}
}

获取全部源代码

参考链接:https://www.cnblogs.com/slmk/p/18011420

相关文章:

  • Python基础篇_修饰符(Decorators)【上】
  • 深入探索 Express.js 的高级特性
  • SpringCloud-Eureka原理分析
  • RK3588平台开发系列讲解(Camera篇)使用v4l2-ctl抓图
  • 电力负荷预测 | 电力系统负荷预测模型(Python线性回归、随机森林、支持向量机、BP神经网络、GRU、LSTM)
  • CAN通讯协议详解
  • 基于Linux操作系统的Docker容器安装MySQL随笔
  • 微软.NET6开发的C#特性——委托和事件
  • vue基本语法总结大全
  • 【开源】JAVA+Vue.js实现高校实验室管理系统
  • Ubuntu 22 部署Zabbix 6.4
  • LeetCode、216. 组合总和 III【中等,组合型枚举】
  • Linux介绍和命令使用
  • 办公软件巨头CCED、WPS面临新考验,新款办公软件异军突起
  • 计算机设计大赛 深度学习 python opencv 火焰检测识别
  • .pyc 想到的一些问题
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Mocha测试初探
  • React+TypeScript入门
  • spring boot下thymeleaf全局静态变量配置
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • Vue实战(四)登录/注册页的实现
  • vue--为什么data属性必须是一个函数
  • 机器学习中为什么要做归一化normalization
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 新版博客前端前瞻
  • 译自由幺半群
  • 走向全栈之MongoDB的使用
  • 阿里云移动端播放器高级功能介绍
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #pragam once 和 #ifndef 预编译头
  • (pojstep1.1.2)2654(直叙式模拟)
  • (八)Flask之app.route装饰器函数的参数
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (未解决)macOS matplotlib 中文是方框
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .bat文件调用java类的main方法
  • .NET 8.0 发布到 IIS
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET 解决重复提交问题
  • .NET/C# 的字符串暂存池
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .net连接oracle数据库
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • @ModelAttribute注解使用
  • @synthesize和@dynamic分别有什么作用?
  • [ SNOI 2013 ] Quare
  • [C#]C# OpenVINO部署yolov8图像分类模型
  • [C++]18:set和map的使用