在 Python 中使用 OpenCV 创建二维码扫描器
我们都熟悉不同产品中存在的条形码。基于摩尔斯电码,条形码通过使用线条和空格表示信息来存储信息,并水平存储数据。
最近,二维码也开始流行起来。QR 码存储在一个盒子中,并使用带有一些点的黑白方块组合来表示。
它也是基于摩尔斯电码的,所以它可以被认为是一种条形码矩阵。
二维码在存储方面优于传统条码。它以两个方向存储数据;因此它可以包含比条形码更多的信息。
此信息可以是 URL、联系人和其他最多四千个字符的信息。现在几乎每部手机都有一个二维码扫描器的应用程序。
本教程将演示如何使用 Python 中的 OpenCV 库创建二维码扫描器。
OpenCV 库包含可以有效存储和处理图像的不同功能和类。我们可以在我们的框架中应用广泛的预定义技术。
使用 QRCodeDetector
类在 Python 中使用 OpenCV 创建二维码扫描器
OpenCV 库的 4.0.0 版引入了 QRCodeDetector
类。此类包含可用于检测和扫描图像以获取 QR 码的方法。
我们可以使用不同的方法扫描单个和多个二维码。
此类中的 detect()
方法用于扫描图像中的二维码;它会找到包含 QR 码的框。decode()
方法对检测到的二维码进行解码。
要检测给定图像中的多个 QR 码,我们可以使用 detectMulti()
和 decodeMulti()
函数。为了检测和解码曲面上的代码,我们分别使用 detectCurved()
和 decodeCurved()
方法。
我们可以使用 detectandDecode()
函数同时检测和解码图像中的代码。对于此方法,还存在 detectandDecodeCurved()
和 detectandDecodeMulti()
方法。
现在让我们使用这个类创建一个非常简单的二维码,并将扫描下图中的二维码:
请参阅下面的代码。
import cv2
img = cv2.imread('2.jpg')
det = cv2.QRCodeDetector()
info, box_coordinates, _ = det.detectAndDecode(img)
if box_coordinates is None:
print('No Code')
else:
print(info)
if box_coordinates is not None:
box_coordinates = [box_coordinates[0].astype(int)]
n = len(box_coordinates[0])
for i in range(n):
cv2.line(img, tuple(box_coordinates[0][i]), tuple(box_coordinates[0][(i+1) % n]), (0,255,0), 3)
cv2.imshow('Output', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出:
http://sampleurl.com
在上面的示例中,我们创建了 QRCodeDetector
类的对象,并使用 detectandDecode()
函数扫描和解码给定图像中的 QR 码。该函数返回显示的二维码信息。
它还返回了围绕 QR 码的框的坐标。我们使用 line()
函数使用这些坐标在图像上绘制其边界。
显示最终图像,我们使用 waitKey()
和 destroyAllWindows()
函数来防止此窗口自动关闭,并等待用户在关闭它之前按下某个键。
在我们的示例中,我们从目录中读取图像并扫描 QR 码。我们可以通过使用网络摄像头并从那里读取图像来使其更具交互性。
OpenCV 提供了 VideoCapture
类来捕捉和读取网络摄像头的视觉效果。
结论
本教程演示了使用 Python 的 OpenCV 库创建一个简单的二维码扫描器。我们首先讨论了 QR 码的基础知识、它与条形码的比较以及它可以存储的信息。
我们简要讨论了 OpenCV 库中的 QRCodeDetector
类,它提供了许多从图像中检测和解码 QR 码的方法。我们提供了一个简单的 QR 码扫描器示例,使用此类扫描和解码给定图像中的 QR 码。
Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.
LinkedIn