太神奇了!使用C#实现自动核验健康码:(2)OCR识别
前言
上次太神奇了!使用C#實現自動核驗健康碼:(1)二維碼識別,我們已經實現了識別健康碼的顏色,但是健康碼的內容不包含時間屬性。那么使用圖片就可以通過檢查,肯定是不合適的。
因此,我們還需要讀出健康碼上方的“更新于: xxxx”,獲得最后的健康碼更新時間,保證識別的是真實的健康碼。
實現
1. OCR服務
由于通過攝像頭獲得的是圖片,因此我們需要使用OCR文字識別功能,將圖片上的文字讀取出來。
可以有多種方式實現OCR功能,在這里,我們使用的是百度提供的“PaddleOCR 超輕量級中文OCR模型”在線體驗服務(https://www.paddlepaddle.org.cn/hub/scene/ocr)。
它的優點是不用注冊即可使用,而且速度和識別率也很高。
可以看到,服務返回的是一個JSON字符串,對應的C#數據結構如下:
調用OCR服務代碼如下:
var?content?=?JsonConvert.SerializeObject(new?{?image?=?ToBase64(img)?}); var?json?=?Post("https://www.paddlepaddle.org.cn/paddlehub-api/image_classification/chinese_ocr_db_crnn_mobile",?content); var?ocrResult?=?JsonConvert.DeserializeObject<OcrResult>(json);2. 解析更新時間
我們需要讀出Result數組的第一個元素,然后遍歷Data數組,判斷Text是不是以“更新于”開頭,如果是,后面緊跟的就是更新時間。
由于圖片角度的問題,一行文字可能會被截成2個TextData,因此需要做下判斷。
具體實現代碼如下:
string?updateTimeText?=null; var?dataResult?=?ocrResult.Result.First(); for?(int?i?=?0;?i?<?dataResult.Data.Count;?i++) {if?(dataResult.Data[i].Text.StartsWith("更新于:")?&&?dataResult.Data[i].Text.Length>4){updateTimeText?=?dataResult.Data[i].Text.Substring(4);break;}else?if?(dataResult.Data[i].Text.Equals("更新于:")?||?dataResult.Data[i].Text.Equals("更新于")){if?(i?<?dataResult.Data.Count?-?1){updateTimeText?=?dataResult.Data[i+1].Text;break;}} }if?(string.IsNullOrEmpty(updateTimeText)) {?return?null;? }DateTime?updateTime; if?(!DateTime.TryParseExact(updateTimeText,?"yyyy-MM-ddHHmm",?null,??DateTimeStyles.None,?out?updateTime)) {return?null; }return?updateTime;3. 判斷更新時間
最后,只顯示更新時間在5分鐘之內的健康碼,表示是最新的健康碼:
var?updateTime?=?GetUpdateTime(img); if?(!updateTime.HasValue||?Math.Abs((DateTime.Now?-?updateTime.Value).TotalMinutes)?>?5) {return; }label2.Text?=?updateTime.Value.ToString("yyyy-MM-dd?HH:mm");ShowColor(color);結論
把功能和界面完善一下,完全可以做成一個產品,代替人工核驗健康碼。
科技改變生活!
如果你覺得這篇文章對你有所啟發,請關注我的個人公眾號”My IO“,記住我!
總結
以上是生活随笔為你收集整理的太神奇了!使用C#实现自动核验健康码:(2)OCR识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET Core端点路由中三种让
- 下一篇: C#10在List, Queue 以及S