太神奇了!使用C#实现自动核验健康码:OCR识别

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了太神奇了!使用C#实现自动核验健康码:OCR识别相关的知识,希望对你有一定的参考价值。

前言

上次太神奇了!使用C#实现自动核验健康码:(1)二维码识别,我们已经实现了识别健康码的颜色,但是健康码的内容不包含时间属性。那么使用图片就可以通过检查,肯定是不合适的。

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

实现

1. OCR服务

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

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

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

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

public class OcrResult
{ 
    public IReadOnlyList<ResultData> Result { get; set; }

    public class ResultData
    {
        public IReadOnlyList<TextData> Data { get; set; }

        public class TextData
        {
            public string Text { get; set; }
        }
    }
}

调用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#实现自动核验健康码:OCR识别的主要内容,如果未能解决你的问题,请参考以下文章

Java 如何使用 OCR 技术识别验证码实现自动化登陆

WebDriver中自动识别验证码--Python实现

web网站验证码自动识别

Web自动化如何借助OCR,自动识别验证码

C#车牌号码识别-基于百度OCR

20 行代码带你实现验证码自动识别