COVID疫苗卡验证教程系列:第1部分:图像对齐|第2部分:验证检查Verification Checks
现在超过一半的美国人已经接受了至少一次COVID疫苗接种,关于要求接种疫苗证明才能进入酒店、机场和游轮等地方的讨论一直在进行。疫苗护照的想法已经提出,并可能在不久的将来出现。over half of all Americans have received at least one COVID vaccination shot vaccine passports has been proposed
然而,就目前而言,唯一能证明他们接种过疫苗的东西就是他们的疾控中心颁发的冠状病毒疫苗接种卡。在这篇博客文章中,我们分享了一种检测这些卡并提供自动验证的方法。
我们的程序是用Python实现的,它将一张图像作为输入,并输出图像中是否存在COVID疫苗接种卡。我们鼓励您访问我们的GitHub存储库并亲自试用,甚至在您自己的验证管道中使用它。visit our GitHub repository
自动验证是一个多步骤过程,可执行图像对齐、光学字符识别(OCR)、模板匹配等。我们在下面提供了一个完整的教程,详细介绍了我们的实现。
重要的是要注意,这不应该在关键使用案例中使用,因为COVID疫苗接种卡很容易被伪造。
教程第1部分:图像对齐
验证过程的第一步是将输入图像与模板图像对齐,在本例中模板图像是空白的COVID疫苗接种卡。图像配准,也称为图像配准,是计算机视觉领域研究较多的问题。我们利用并构建在PyImageSearch的Adrian Rosebrock的文档注册实现之上。我推荐阅读他的教程以了解全部细节,但下面我们将简要回顾一下该过程的亮点。image registration his tutorial
为了对齐图像,我们必须确定单应矩阵,它为我们提供了输入扫描和模板图像之间的映射。要估计2D单应矩阵,我们需要两个图像?之间至少有四个关键点匹配?(最好比四个匹配多得多,因为某些匹配很有可能是不正确的)。homography matrix
在提取关键点之前,我们首先将模板和扫描图像转换为灰度。我们这样做是因为疫苗卡由印刷在白纸上的黑色墨水组成,因此我们可以安全地假设任何颜色信息都是由不完美的照明/打印引起的噪音。
imageGray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
templateGray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
对于特征提取,我们利用ORB特征检测器,正如ORB论文的标题所述,它是“SIFT或冲浪的有效替代方案”²。ORB也是免费使用的,而SIFT和冲浪都是专利!
orb = cv2.ORB_create(maxFeatures)
(kpsA, descsA) = orb.detectAndCompute(imageGray, None)
(kpsB, descsB) = orb.detectAndCompute(templateGray, None)
然后,我们使用OpenCV强力关键点匹配器,以汉明距离作为相似性度量。这为我们提供了两个图像之间的关键点匹配。brute-force keypoint matcher
method = cv2.DESCRIPTOR_MATCHER_BRUTEFORCE_HAMMING
matcher = cv2.DescriptorMatcher_create(method)
matches = matcher.match(descsA, descsB, None)
这会产生大量匹配,其中大多数通常是不正确的。为了应对这一问题,我们然后根据相似性得分对匹配项进行排序,并只保留前20%的匹配项。然后,我们将匹配重新组织到两个单独的列表ptsA和ptsb中。
matches = sorted(matches, key=lambda x:x.distance)
ptsA = np.zeros((len(matches), 2), dtype="float")
ptsB = np.zeros((len(matches), 2), dtype="float")
请注意,即使我们丢弃了最不可信的匹配,仍然有许多不正确的匹配。这不是一个大问题的原因是因为我们用于单应性估计(RANSAC)的方法对异常值是健壮的(在本例中,异常值是不正确的匹配)。
RANSAC的工作原理是从最小样本(在本例中,计算单应对应需要四个匹配)估计一个模型,然后通过拟合到其他数据点来改进估计。测试了许多最小样本,然后从其他数据点获得最多“支持”的样本被认为是胜利者。我们的想法是,即使有许多异常值,真实的估计也会胜出,因为异常值不应该与任何其他数据点一致。
(H, mask) = cv2.findHomography(ptsA, ptsB, method=cv2.RANSAC, ransacReprojThreshold=5)
注意RANSAC算法是如何成功地过滤排除大多数不正确的匹配的!只有Inlier数据点(图像中的绿色匹配)用于单应性估计。
现在剩下的工作就是使用估计的单应性来扭曲输入图像,并将其与模板对齐。
(h, w) = template.shape[:2]
aligned = cv2.warpPerspective(image, H, (w, h))
输出的是对齐的图像!
COVID疫苗卡验证教程系列:第1部分:图像对齐|第2部分:验证检查Verification Checks
参考文献
[1]:哈特利,理查德,安德鲁·齐瑟曼。计算机视觉中的多视图几何。第二版,剑桥大学出版社,2003年。
[2]:Rublee,Ethan等人。
原创文章,作者:fendouai,如若转载,请注明出处:https://panchuang.net/2021/06/29/%e8%87%aa%e5%8a%a8covid%e7%96%ab%e8%8b%97%e6%8e%a5%e7%a7%8d%e5%8d%a1%e9%aa%8c%e8%af%81/