本文將介紹使用.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(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; }
}
軟件使用

可以前往 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