使用C#实现自动核验健康码:(2)OCR识别

我们已经实现了识别健康码的颜色,但是健康码的内容不包含时间属性。那么使用图片就可以通过检查,肯定是不合适的。

因此,我们还需要读出健康码上方的“更新于: xxxx”,获得最后的健康码更新时间,保证识别的是真实的健康码。

实现

1. OCR服务

由于通过摄像头获得的是图片,因此我们需要使用OCR文字识别功能,将图片上的文字读取出来。

可以有多种方式实现OCR功能,在这里,我们使用的是百度提供的“PaddleOCR 超轻量级中文OCR模型”在线体验服务(https://www.paddlepaddle.org.cn/hub/scene/ocr)。

它的优点是不用注册即可使用,而且速度和识别率也很高。

可以看到,服务返回的是一个JSON字符串,对应的C#数据结构如下:

 
  1. public class OcrResult

  2.     public IReadOnlyList<ResultData> Result { get; set; }

  3.     public class ResultData

  4.     {

  5.         public IReadOnlyList<TextData> Data { get; set; }

  6.         public class TextData

  7.         {

  8.             public string Text { get; set; }

  9.         }

  10.     }

  11. }

调用OCR服务代码如下:

 
  1. var content = JsonConvert.SerializeObject(new { image = ToBase64(img) });

  2. var json = Post("https://www.paddlepaddle.org.cn/paddlehub-api/image_classification/chinese_ocr_db_crnn_mobile", content);

  3. var ocrResult = JsonConvert.DeserializeObject<OcrResult>(json);

2. 解析更新时间

我们需要读出Result数组的第一个元素,然后遍历Data数组,判断Text是不是以“更新于”开头,如果是,后面紧跟的就是更新时间。

由于图片角度的问题,一行文字可能会被截成2个TextData,因此需要做下判断。

具体实现代码如下:

 
  1. string updateTimeText =null;

  2. var dataResult = ocrResult.Result.First();

  3. for (int i = 0; i < dataResult.Data.Count; i++)

  4. {

  5.     if (dataResult.Data[i].Text.StartsWith("更新于:") && dataResult.Data[i].Text.Length>4)

  6.     {

  7.         updateTimeText = dataResult.Data[i].Text.Substring(4);

  8.         break;

  9.     }

  10.     else if (dataResult.Data[i].Text.Equals("更新于:") || dataResult.Data[i].Text.Equals("更新于"))

  11.     {

  12.         if (i < dataResult.Data.Count - 1)

  13.         {

  14.             updateTimeText = dataResult.Data[i+1].Text;

  15.             break;

  16.         }

  17.     }

  18. }

  19. if (string.IsNullOrEmpty(updateTimeText))

  20.     return null; 

  21. }

  22. DateTime updateTime;

  23. if (!DateTime.TryParseExact(updateTimeText, "yyyy-MM-ddHHmm", null,  DateTimeStyles.None, out updateTime))

  24. {

  25.     return null;

  26. }

  27. return updateTime;

3. 判断更新时间

最后,只显示更新时间在5分钟之内的健康码,表示是最新的健康码:

 
  1. var updateTime = GetUpdateTime(img);

  2. if (!updateTime.HasValue

  3.     || Math.Abs((DateTime.Now - updateTime.Value).TotalMinutes) > 5)

  4. {

  5.     return;

  6. }

  7. label2.Text = updateTime.Value.ToString("yyyy-MM-dd HH:mm");

  8. ShowColor(color);

结论

把功能和界面完善一下,完全可以做成一个产品,代替人工核验健康码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值