计算机视觉开辟了 许多可能性,最简单和最受欢迎的日常应用之一是使用二维码和条形码扫描仪。
当你在超市收银台结账时会发生什么?
收银员使用设备扫描你购物篮中的每件商品,然后将价格自动记录在系统中以生成你的账单。该设备只不过是一个二维码/条形码扫描仪,而这正是我们今天要构建的!
在深入研究代码之前,让我们快速了解一下二维码及其用途。
什么是二维码?二维码代表快速响应码。它是一种矩阵类型代码,通常用于跟踪项目。二维码以像素的形式存储数据,这些数据对应于二进制代码,可以解释为显示实际数据。
这是二维码的基本结构。
二维码在各个领域都有应用,例如:
用户身份识别和身份验证(身份证)
跟踪单个项目(库存管理)
共享支付信息(GPay、Paytm)
分享链接、照片、媒体
二维码的主要优点之一是可以以加密形式共享数据,而无需显式透露编码数据。这可以作为额外的保护层,以防止滥用敏感信息。
与二维码非常相似的条形码也是机器可读的加密代码,但与二维码不同的是,数据以不同间距和厚度的条形形式加密。二维码被认为是 2D 条形码,因为它可以水平和垂直存储数据,而不是通常在水平方向存储数据的条形码。因此二维码比条形码更强大。
现在我们知道了什么是二维码,让我们开始使用我们的 python 代码。
导入库
对于我们的项目,我们将使用 OpenCV 来读取图像、获取视频流输入并显示我们的输出。
我们需要的主要库是pyzbar和zbar库来解码我们的加密二维码。这些是有助于解码条形码和二维码的开源 python 库。
我们还需要 NumPy 库。
进行必要的安装:
import numpy as np from pyzbar.pyzbar import decode import cv2从图像扫描代码
首先,我们将借助 cv2 库读取保存在“qr1.png”中的二维码图像。然后借助 pyzbar 中的 decode 方法,让我们尝试解码我们的代码并分析结果。
这是我们将用作“qr1.png”的二维码
(来源:VectorStock.com/26810014)
#Reading QR Code from an Image
img = cv2.imread("qr1.png")
code = decode(img)
print(code)
输出:
现在,显示了很多信息。让我们了解输出的每个部分。
data ->此字段为我们提供文本或二维码中编码的信息
type ->这个字段告诉我们代码的类型 QRCODE 或 BARCODE
rect -> 这给出了包含 QR 图像的矩形的左侧、顶部、宽度和高度。即使二维码倾斜,矩形仍保持直立,为我们提供了一个包围整个二维码的边界矩形
polygon ->这为我们提供了 QR 图像周围多边形的确切角点。如果二维码的图像是倾斜的,那么包围它的多边形也是如此。
这就是为什么我们要使用多边形的坐标来绘制我们的边界框,这样即使旋转二维码我们也能得到代码的准确边界。
现在,一张图片可能有多个二维码。因此,让我们将代码放入 for 循环中,以便它可以检测图像中的所有条形码。
由于我们主要对编码信息感兴趣,让我们只显示编码文本。
for barcode in decode(img):
print(barcode.data) #in bytes
text = barcode.data.decode('utf-8')
print(text)
print(barcode.rect)
输出
第一行输出显示 b'Hello! '。b 表示它是字节文字。稍后使用“utf-8”方案对其进行解码,以获得 str 文本。
现在你已经成功地解码了二维码中的编码文本!
实时解码二维码现在让我们尝试使用摄像头输入实时执行此操作。
大多数现实生活中的应用程序,例如超市的二维码扫描仪、用户身份验证或跟踪对象,都需要我们实时解码代码。所以让我们开始吧!
下面的一段代码将使我们能够打开网络摄像头并为输出创建一个辅助窗口。
#Scanning QR Code from Camera Feed vid = cv2.VideoCapture(0) vid.set(3,640) vid.set(4,740)
现在,当视频播放时,我们将像之前一样解码帧中的二维码。除此之外,我们还将使用多边形点在我们的二维码周围绘制边界框,并在相机帧输入本身上显示它们对应的解码文本。
while True:
success, img = vid.read()
for barcode in decode(img):
text = barcode.data.decode('utf-8')
print(text)
polygon_Points = np.array([barcode.polygon], np.int32)
polygon_Points=polygon_Points.reshape(-1,1,2)
rect_Points= barcode.rect
cv2.polylines(img,[polygon_Points],True,(255,255, 0), 5)
cv2.putText(img, text, (rect_Points[0],rect_Points[1]), cv2.FONT_HERSHEY_DUPLEX, 0.8, (255,255, 0), 2)
cv2.imshow("Video", img)
cv2.waitKey(1)
输出
在上面的代码行中,
cv2.polylines(img,[polygon_Points],True,(255,255, 0), 5)
显示我们的二维码周围的边界框。'img' 指定输入帧。
请注意,这里我们使用多边形点,因此即使旋转二维码,我们也能得到准确的边界框。(255,255,0) 指定边界框的颜色,5 表示厚度。
代码行
cv2.putText(img, text, (rect_Points[0],rect_Points[1]), cv2.FONT_HERSHEY_DUPLEX, 0.8, (255,255, 0), 2)
用于显示解码后的文本。如果你仔细观察,你会发现这里我们使用矩形的坐标而不是多边形的坐标来显示文本。这样做的原因是为了确保无论二维码是否旋转,文本都直立显示,以便于阅读。
此输出将向我们显示当二维码直立时和以一定角度保持在相机前时的比较结果。
让我们在一些真实世界的物体上进行测试,看看它是否有效!
确实如此!随意使用尽可能多的二维码进行测试!
另一个有趣的功能是,这个库不仅可以解码二维码,还可以解码条形码,而无需对我们的代码进行任何更改!
让我们看看带有条形码相机馈送输入的结果。
瞧!你现在已经使用一些简单的 OpenCV 函数和 pyzbar 库构建了你的条形码和二维码扫描仪!
现在是有趣的部分!
构建用户认证系统让我们看一个真实的用例场景。
公司的每个员工都会获得一张带有相应二维码的身份证。一些从事特殊项目的员工被授予进入特定实验室的权限,而其他人则进入禁区。每个员工必须在入口处扫描他们的身份证才能进入实验室。
我们已经有了我们的二维码扫描仪。现在让我们把迄今为止学到的所有东西都用起来。我们将构建一个简单的用户身份验证系统,用于检查二维码是否属于授权人员并决定是否授予他们访问权限。
那么让我们开始编写代码吧!
import numpy as np from pyzbar.pyzbar import decode import cv2
#Scanning QR Code from Camera Feed vid = cv2.VideoCapture(0) vid.set(3,640) vid.set(4,740)
已导入库并设置了视频捕获。现在我们必须读取包含授权员工解码的二维码文本的文本文件,并将它们存储在一个列表中。
这是我们的文本文件“Authorised.txt”
with open('Authorised.txt', 'r') as file:
auth_list = file.read().strip()
print(auth_list)
输出
作为参考,让我们在输入图像上运行之前的代码,以显示每个二维码的解码文本。稍后我们将需要它来验证我们的模型是否正常工作。让我们看看我们得到的输出。
输出
现在我们需要做的就是检查每个二维码,如果解码的文本出现在授权人员列表中。如果匹配,那么我们将使用绿色 (0,255,0) 边界框并显示文本“Access Granted”,否则我们将使用红色 (0,0, 255) 边界框并显示消息“Unauthorised Access”。
while True:
success, img = vid.read()
for barcode in decode(img):
text = barcode.data.decode('utf-8')
text=str(text)
if text not in auth_list:
color=(0,0,255)
displaytext = "Unauthorised Access"
else:
color=(0,255,0)
displaytext = "Access Granted"
polygon_Points = np.array([barcode.polygon], np.int32)
polygon_Points=polygon_Points.reshape(-1,1,2)
rect_Points= barcode.rect
cv2.polylines(img,[polygon_Points],True,color, 3)
cv2.putText(img, displaytext, (rect_Points[0],rect_Points[1]), cv2.FONT_HERSHEY_PLAIN, 0.9, color, 2)
cv2.imshow("Video", img)
cv2.waitKey(1)
输出
赞!你做到了!
我们的模型完美地扫描二维码并仅授予授权员工访问权限!你已使用二维码扫描仪成功构建了一个用户身份验证系统,该系统仅授予授权员工扫描身份证上的二维码后的访问权限!
二维码真正有用的领域有很多。所以继续尝试不同的代码及其应用程序吧!
☆ END ☆
如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。
↓扫描二维码添加小编↓



