本文将介绍使用.NET开发的一款桌面截图 OCR 工具,软件已开源,地址:https://github.com/sangyuxiaowu/Snipping_OCR
背景
因为不同地方人们的使用习惯不同,国内可能截图更多的是使用QQ,微信等即时聊天工具提供的截图功能。所以我们竟然可能会遇到这样的场景:按了截图快捷键却发现并没有任何反应,尝试了多次才意识到 —— 没有开聊天软件。
当我们需要OCR识别时也是经常通过这些社交软件,QQ可以在电脑端使用,微信的文字识别却是需要在手机端识别后发给电脑端。
作为一个老年人,QQ 已经不怎么用了,而且 QQ 文字识别的结果复制编辑不是很方便。并且针对保密级别比较高的工作,我们还是更倾向于离线的 OCR 工具。
软件的实现
软件的设计非常简单,通过调用 Windows 系统本身的截图功能,在用户截图后,从剪贴板获取到图片后通过 PaddleOCRSharp 来进行 OCR 的识别,然后将结果输出。
软件的难点之一其实调用系统的截图,中间的波折可以查看今天推送的另一篇文章《为应用添加截图功能》。
OCR 识别已经非常成熟了,百度开源的 PaddleOCR 框架相对 Tesseract 中文识别的效果好太多太多了。得益于开源项目 PaddleOCRSharp[1] 对C++代码修改并封装的.NET的工具类库,我们可以方便的在 .NET 项目中实现 OCR 功能。
var ocrResult = new OCRResult();
using PaddleOCREngine engine = new PaddleOCREngine(, 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; }
}
软件使用
可以前往 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