太神奇了!使用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,一经查实,立即删除!

相关文章

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

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

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

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

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();…

女生会 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管理控制台--按管…

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

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

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

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

反向压力

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

AVL树----java

AVL树----java AVL树是高度平衡的二叉查找树 1.单旋转LL旋转 理解记忆&#xff1a;1.在不平衡的节点的左孩子的左孩子插入导致的不平衡&#xff0c;所以叫LL private AVLTreeNode<T> leftLeftRotation(AVLTreeNode<T> k2) {AVLTreeNode<T> k1;k1 k2.left;k2…

其实你女朋友也不是很爱你...

1 你玩她口红化妆品试试▼2 我妈介绍的相亲对象优点&#xff1a;每天主动问早缺点&#xff1a;每天只问早▼3 女儿过度高估老爸了▼4 国际油价暴跌全军出击买买买▼5 有人喜欢我吗&#xff1f;我爱吃炸鸡▼6 有厕纸的那部分人还有全球百分之50的双黄连▼7 其实生物书比较…

文末有彩蛋 | 第四周课程回顾与总结

我们在前三周的课程上&#xff08;第一周、第二周、第三周&#xff09;&#xff0c;系统讲授了 FOSS 和 COSS 的课程内容&#xff0c;第四周&#xff0c;我们开始进入 OSPO&#xff08;开源项目办公室&#xff09;的部分。本导学班在调研全球开源教育与课程的基础上&#xff0c…

win10 软路由_「保姆级」万晓博带你用软路由搭建家庭网络中心第1节-准备工作...

本章前言&#xff1a;  去年无意中在群我的一个群里大佬提起过软路由&#xff0c;那时候对这个需求并不是很大&#xff0c;所以对软路由只是名字概念而已&#xff0c;但是后面群里就一软路由这个话题 炒起来了&#xff0c;有的人说软路由就是利用自己闲置设备(PC笔记本)的或者…

【转】构建Android平台Google Map应用

http://www.moandroid.com/?p1360 Android 的新版本提供了的功能&#xff0c;通过这段视频&#xff0c;大家可以先简单了解下&#xff1a; Android 提供的地图&#xff08;Map&#xff09;功能可能是广大开发者非常关心的一个部分。到目前为止&#xff0c;开发内嵌式地图应用的…

将虚拟机转换成模板

在制作模板前&#xff0c;先要准备一个干净的操作系统&#xff0c;或者安装上经常使用的软件在虚拟机中&#xff0c;安装好后&#xff0c;将其正常关机&#xff0c;之后就可以转换成模板了。转换后的虚拟机将不会在主机管理中看到&#xff0c;而只能在模板中看到。克隆转换时克…

假如你学过高数,那你这一辈子都不会忘记这个人

▲ 点击查看2020年3月&#xff0c;菲列兹伦敦奖评奖委员会宣布&#xff0c;2020年度菲列兹伦敦奖将授予三位科学家&#xff0c;除开美国的 Vinokur 博士、以及德国的Steglich 教授以外&#xff0c;最后一位就是清华大学副校长、北京量子信息科学研究院院长薛其坤院士。薛其坤院…

.Net Core with 微服务 - 分布式事务 - TCC

上一次我们讲解了分布式事务的 2PC、3PC 。那么这次我们来理一下 TCC 事务。本次还是讲解 TCC 的原理跟 .NET 其实没有关系。TCC Try 准备阶段&#xff0c;尝试执行业务Confirm 完成业务Cancel 回滚准备阶段的业务TCC 事务其实是 2PC 的一个扩展。上一次我们说了 2PC &#xff…

第10章-管理Hadoop集群-hadoop 安全模式相关知识点

为什么80%的码农都做不了架构师&#xff1f;>>> 1、namenode启动时&#xff0c;namenode节点都做了哪些动作&#xff1f;fsimage和edits有什么变化&#xff1f; 2、namenode什么时候开始监听RPC和HTTP请求&#xff1f; namenode启动时&#xff0c;首先将映像文件(f…

oracle挂证多少钱一个月_惊呆,一条sql竟然把Oracle搞挂了

一条sql就能把oracle搞挂了&#xff0c;真的是不敢相信啊&#xff0c;前几天生产上确实出现了这样一个故障&#xff0c;我们来一起做一个事件回放。系统介绍系统架构见下图&#xff1a;fileapplication1和application2是一个分布式系统中的2个应用&#xff0c;application1连接…