太神奇了!使用C#实现自动核验健康码:(2)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“,记住我!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299034.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多个数求平均数java_[分享]求任意个数的平均数!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼自己编的小程序:import java.util.*;class notsure{private double numlist[];public notsure(double ... list)/*此数组个数可任意.*/{numlistlist;}public double doit(){double result0;if(numlist.length!0){int sum0;for(doub…

bo耳机h5使用说明_真香时刻·性价比大旗——红米AirDots2 TWS真无线耳机体验测评...

TWS真无线耳机经过了这几年的发展&#xff0c;在音质、连接稳定性、易用性等方面都有了长足的发展&#xff0c;价格也从最早的上千元下探到了数百元&#xff0c;真正从发烧玩家的尝鲜设备变成了大众的日常用品。我用过的TWS耳机不下数十个&#xff0c;但即使是如Bose、B&O等…

卖股技巧

买对股票只完成投资过程的一半或更少&#xff0c;接下来就是跟踪个股&#xff0c;并在股价大幅上涨之后卖掉股票&#xff0c;所以如何卖股票至关重要。笔者通过长期的研究&#xff0c;总结出了卖股的五大技巧。 技巧一&#xff1a;低于买入价8&#xff05;-9&#xff05;坚决止…

这个行业人才紧缺,就业率超高!未来大有可为!

全世界只有3.14 % 的人关注了爆炸吧知识近几年&#xff0c;伴随人工智能的兴起&#xff0c;数据分析师、算法工程师等职业也迎来需求高峰。时下人工智能是炙手可热的一个行业&#xff0c;2015-2018年&#xff0c;中国人工智能产业市场规模从112.4亿元增长至415.5亿元&#xff0…

多线程(C++)临界区Critical Sections

一 、Critical Sections&#xff08;功能与Mutex相同&#xff0c;保证某一时刻只有一个线程能够访问共享资源&#xff0c;但是不是内核对象&#xff0c;所以访问速度比Mutex快&#xff0c;但是没有等待超时的功能&#xff0c;所以有可能导致死锁&#xff0c;使用要小心&#xf…

由社区推动的 .NET 6 新 API

原文&#xff1a;bit.ly/3ykXfgJ作者&#xff1a;David Fowler翻译&#xff1a;精致码农-王亮.NET 6 即将到来&#xff0c;我想分享一些我最喜欢的 .NET 和 ASP.NET Core 中的新 API&#xff0c;你一定会喜欢&#xff0c;因为它们是由我们优秀的 .NET 开发者社区推动的。让我们…

启动与停止mysql服务的命令

在“运行”中运行如下命令&#xff1a;启动mysql: net start mysql 停止mysql: net stop mysql 转载于:https://www.cnblogs.com/qiantuwuliang/archive/2009/07/12/1521921.html

hash算法_到底什么是Hash?Hash算法的原理和实际应用讲解

提到hash&#xff0c;相信大多数同学都不会陌生&#xff0c;之前很火现在也依旧很火的技术区块链背后的底层原理之一就是hash&#xff0c;下面就从hash算法的原理和实际应用等几个角度&#xff0c;对hash算法进行一个讲解。1、什么是HashHash也称散列、哈希&#xff0c;对应的英…

java 子类 复制_关于java子类继承来的属性与方法究竟是完全复制还是共用使用...

关于java子类继承来的属性与方法究竟是完全复制还是共用使用关于java子类继承来的属性与方法究竟是完全复制还是共用使用今天在学习java的面向对象时&#xff0c;无意间发现一个问题。public class testEquals{public static void main(String[] args){Child cd1 new Child();…

关于IE某些原因导致下拉列表弹出阻止窗口的解决办法

找个N多方案&#xff0c;未果。最终还是重新安装IE解决。 原因可能是因为我同时安装的IE6&#xff0c;IE7共存导致的。转载于:https://www.cnblogs.com/23shi/archive/2010/09/29/1838747.html

女生会 P 的可不仅仅是丰胸和瘦腿......

1 打死你都想不到女生还有这种操作▼2 小朋友的大哥式道歉▼3 可能舌头和尾巴对猫来说也是另一种生物吧&#xff1f;▼4 当代年轻人的发际线▼5 这一招江湖上俗称“老汉推车”▼6 身正不怕影子斜人正不怕车子歪▼7 这位大爷太过于自信了▼你点的每个赞&#xff0c;我都认…

何时使用领域驱动设计

何时使用领域驱动设计&#xff1f;其实当你的应用程序架构设计是面向业务的时候&#xff0c;你已经开始使用领域驱动设计了。领域驱动设计既不是架构风格&#xff08;Architecture Style&#xff09;&#xff0c;也不是架构模式&#xff08;Architecture Pattern&#xff09;&a…

使用MOM 2005监视DC的磁盘空间

在使用MOM 2005监视DC的磁盘空间之前首先需要在MOM 2005服务器上导入Active Directory的管理包,这样MOM 2005服务器才能够对域控制器进行管理 我来到一台计算机名称叫做MOM2005的计算机 它是一台MOM 2005管理服务器同时是一台MOM 2005报表服务器 打开MOM 2005管理控制台--按管…

php如何读出xml的节点内容 两个例子

第一个例子&#xff1a; PHP与XML联系紧密&#xff0c;下面是一个较简单的解析XML节点数据的例子&#xff0c;示例中自定义有一个XML样例文件代码&#xff0c;通过PHP将依次读取出XML节点中的id、name和email数据&#xff0c;是读取较大的XML文件的前提&#xff0c;新手的话&am…

java递归 treeview_treeview递归

1.数据库table A(ID int pk,Value varchar,Fid int)A:ID Value Fid1 value1 02 value2 03 value3 14 vlaue4 15 value5 26 value6 22.递归void BindTree(TreeNodeCollection tnc,string fid){DataView dvds.Tables[0].DefaultView;//…

latex 1图加标题_使用VsCode编译latex心得

本人最早接触latex是刘海洋老师的《latex入门》&#xff0c;大家可自行搜索相关资源查阅&#xff0c;可以作为参考书&#xff0c;不建议从头到尾的翻阅学习。学习窍门在配置好相关软件之后&#xff0c;应当立即编译一个模板&#xff0c;保证能通过。相关的模板如IEEE等学术报告…

Microsoft AJAX Client Library规范的实例

MSDN 帮助&#xff1a; ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/dv_vwdcon/html/285e3a65-b42e-42c5-952d-baf184057899.htm Type.registerNamespace("Demo"); Demo.Person function(firstName, lastName, emailAddress) {this._firstName firstName;this._last…

这就是为什么上帝和魔鬼都喜欢数学......

全世界只有3.14 % 的人关注了爆炸吧知识是上帝的指纹还是魔鬼的聚合物两千多年来&#xff0c;几何学的研究主要集中在欧几里得几何上。正因如此&#xff0c;欧式几何中由直线或曲线、平面或曲面、平直体或曲体所构成的各种几何形状&#xff0c;一直是人类认识自然物体形状的有力…

彻底删除 XP 自带的 Windows Messenger方法

开始->运行->RunDll32 advpack.dll,LaunchINFSection %windir%\INF\msmsgs.inf,BLC.Remove 就这么简单 鲜为人知的安装和卸载绝技&#xff1a;巧用Rundll32&#xff0e;exe在Windows系统中安装和卸载程序是件非常容易的事情&#xff0c;一般用户通过安装和卸载程序向导就…

反向压力

大家好&#xff0c;我是鱼皮&#xff0c;今天分享一个实用的编程小知识 —— 反向压力。在介绍反向压力前&#xff0c;我们先聊聊什么是压力&#xff1f;什么是压力&#xff1f;我是一个打工人&#xff0c;日常工作就是听产品经理的话&#xff0c;写代码做需求。正常打工正常情…