zl程序教程

您现在的位置是:首页 >  后端

当前栏目

使用.NET开发一个屏幕OCR工具

Net工具开发 使用 一个 屏幕 OCR
2023-06-13 09:13:04 时间

本文将介绍使用.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