使用.NET开发一个屏幕OCR工具
本文将介绍使用.NET开发的一款桌面截图 OCR 工具,软件已开源,地址:https://github.com/sangyuxiaowu/Snipping_OCR
背景
因为不同地方人们的使用习惯不同,国内可能截图更多的是使用QQ,微信等即时聊天工具提供的截图功能。所以我们竟然可能会遇到这样的场景:按了截图快捷键却发现并没有任何反应,尝试了多次才意识到 —— 没有开聊天软件。
当我们需要OCR识别时也是经常通过这些社交软件,QQ可以在电脑端使用,微信的文字识别却是需要在手机端识别后发给电脑端。
QQ截图OCR
作为一个老年人,QQ 已经不怎么用了,而且 QQ 文字识别的结果复制编辑不是很方便。并且针对保密级别比较高的工作,我们还是更倾向于离线的 OCR 工具。
软件的实现
软件的设计非常简单,通过调用 Windows 系统本身的截图功能,在用户截图后,从剪贴板获取到图片后通过 PaddleOCRSharp 来进行 OCR 的识别,然后将结果输出。
软件的难点之一其实调用系统的截图,中间的波折可以查看今天推送的另一篇文章《为应用添加截图功能》。
OCR 识别已经非常成熟了,百度开源的 PaddleOCR 框架相对 Tesseract 中文识别的效果好太多太多了。得益于开源项目 PaddleOCRSharp[1] 对C++代码修改并封装的.NET的工具类库,我们可以方便的在 .NET 项目中实现 OCR 功能。
var ocrResult = new OCRResult();
using PaddleOCREngine engine = new PaddleOCREngine(null, new OCRParameter());
ocrResult = engine.DetectText(imgfile);
ocrResult
的返回结果是带坐标位置的,我们可以通过对其进行进一步的处理实现比如身份证的 OCR 识别。
若想使用其开发 WebAPI ,之前版本可以直接返回 ocrResult
,最近某次更新版本后直接返回数据都是空的,可做如下数据处理:
List<Json_TextBlock> res = new List<Json_TextBlock>();
foreach(var item in ocrResult.TextBlocks)
{
var points = new List<object>();
foreach (var p in item.BoxPoints)
{
points.Add(new { p.X, p.Y });
}
res.Add(new Json_TextBlock
{
Score = item.Score,
BoxPoints = points,
Text = item.Text
});
}
// 处理适配新版本的 json 问题
/// <summary>
/// 识别的文本块
/// </summary>
public class Json_TextBlock
{
public List<object> BoxPoints { get; set; } = new List<object>();
public string Text { get; set; }
/// <summary>
/// 置信度
/// </summary>
public float Score { get; set; }
}
软件使用
Snipping_OCR
可以前往 Github 或 Gitee 下载 https://gitee.com/sang93/Snipping_OCR/releases/
双击 Snipping_OCR.exe 启动软件,最小化按钮可将其最小化到系统托盘,关闭则为退出软件,最小化后双击托盘可显示主界面。
软件启动会尝试注册全局热键 Ctrl + Alt + A
可以使用该热键来启动截图识别,暂时不支持修改设置,若快捷无法正常使用,可以使用其他软件或者系统自带的截图工具 “Win + Shift + S”截图后,在托盘使用右键菜单 “识别剪贴板”来进行 OCR 识别。
识别剪贴板
可以将图片拖放到左边空白区域来识别,复制图片文件后也可以在托盘使用右键菜单 “识别剪贴板”来进行 OCR 识别。
References
[1]
PaddleOCRSharp: https://github.com/raoyutian/PaddleOCRSharp
相关文章
- .NET 7 中 LINQ 的疯狂性能提升
- 【愚公系列】2022年12月 .NET CORE工具案例-IHostedService实现任务调度
- .Net Core3.1 SignalR for WPF Asp.net
- 【愚公系列】2022年12月 .NET CORE工具案例-滑块验证码和拼图验证功能实现
- 【愚公系列】2023年01月 .NET CORE工具案例-基于Redis和Sql Server分布式缓存
- .Net 和Assembly下滑其它回升,TIOBE编程语言2022年12排行榜
- 王者荣耀 是基于Unity3d (.NET C#)开发的跨平台游戏详解程序员
- net掌握Linux环境下的.NET开发(linuxdot)
- MongoDB 使用.NET开发充分利用数据库性能(mongodb.net)
- 数据库使用.NET连接MySQL数据库(net连接mysql)
- 联手开发:.NET与Oracle的合作之路(.net和oracle)
- 使用.NET技术操作MySQL数据库:简单易学,高效稳定(.net操作mysql)
- 传智播客ASP.NET初级教程
- Net不再压着 MSSql,语音变得前景无限(net mssql语音)
- Net开发Oracle数据库新技术攻关挑战(.net开发oracle)
- 数据使用NET改变Oracle数据库的奥秘(net修改oracle)
- 使用NET来连接MySQL数据库的简单方法(.net怎么连mysql)
- 型使用NET与MySQL开发动态类型Web应用程序(.net mysql 类)
- NET和MySQL的无缝搭配实现创新的技术路径(.net mysql支持)
- asp.net下URL处理两个小工具方法
- C#(.NET)数据访问连接、查询、插入等操作的封装类
- asp.net日期函数某月的第一天和最后一天的日期
- asp.net(c#)实现从sqlserver存取二进制图片的代码
- ASP.NET中的Menu控件的应用及XmlDataSource的了解
- Asp.Net防止刷新重复提交数据的办法
- .NET中的静态与非静态的区别分析
- .net连接oracle的3种实现方法
- ASP.NET中上传并读取Excel文件数据示例
- asp.net中CSharpThinking扩展方法分析
- ASP.NET中实现定制自己的委托和事件参数类