如何在Python中生成和读取二维码?实现代码示例

2021年11月16日19:19:40 发表评论 1,169 次浏览

Python如何生成和读取二维码?本文带你学习如何使用 qrcode 和 OpenCV 库在 Python 中生成和读取二维码。

二维码是一种矩阵条码,它是一种机器可读的光学标签,其中包含有关其所附物品的信息。实际上,二维码通常包含指向网站或应用程序等的定位器、标识符或跟踪器的数据。

如何在Python中生成和读取二维码?在本教程中,根据一些Python生成和读取二维码示例,你将学习如何使用qrcodeOpenCV库在 Python 中生成和读取二维码。

安装所需的依赖项:

pip3 install opencv-python qrcode numpy

生成二维码

Python如何生成和读取二维码?首先,让我们从生成二维码开始,使用qrcode库基本上很简单:

import qrcode
# example data
data = "https://www.thepythoncode.com"
# output file name
filename = "site.png"
# generate qr code
img = qrcode.make(data)
# save img to a file
img.save(filename)

这将在当前目录中生成一个名为“site.png”的新图像文件,其中包含指定数据的二维码图像(在本例中为该网站 URL),如下所示:

如何在Python中生成和读取二维码?实现代码示例

如何在Python中生成和读取二维码?你还可以使用这个库来完全控制使用qrcode.QRCode()该类的QR 码生成,你可以在其中实例化和指定大小、填充颜色、背景颜色和纠错,如下Python生成和读取二维码示例所示:

import qrcode
import numpy as np
# data to encode
data = "https://www.thepythoncode.com"
# instantiate QRCode object
qr = qrcode.QRCode(version=1, box_size=10, border=4)
# add data to the QR code
qr.add_data(data)
# compile the data into a QR code array
qr.make()
# print the image shape
print("The shape of the QR image:", np.array(qr.get_matrix()).shape)
# transfer the array into an actual image
img = qr.make_image(fill_color="white", back_color="black")
# save it to a file
img.save("site_inversed.png")

所以在QRCode类的创建中,我们指定了一个version参数,它是一个1到40的整数,控制二维码图片的大小(1是小,21x21矩阵,40是185x185矩阵),但是这个会被覆盖数据不符合你指定的大小。在我们的例子中,它将自动扩展到版本 3。

box_size参数控制二维码的每个框有多少像素,而border控制边框应该有多少框厚。

然后我们使用qr.add_data()方法添加数据,使用方法将其编译为数组qr.make(),然后使用方法制作实际图像qr.make_image()。我们将白色指定为 the fill_color,将黑色指定为 the back_color,这与默认二维码完全相反,请查看:

如何在Python中生成和读取二维码?实现代码示例图像的形状确实放大了,而不是21x21:

The shape of the QR image: (37, 37)

相关: 如何在 Python 中制作条形码阅读器。

阅读二维码

Python如何生成和读取二维码?有很多工具可以读取二维码。但是,我们将为此使用OpenCV,因为它很流行且易于与网络摄像头或任何视频集成。

好的,打开一个新的Python文件,跟我一起来看看我们刚刚生成的图像:

import cv2
# read the QRCODE image
img = cv2.imread("site.png")

幸运的是,OpenCV已经内置了二维码检测器:

# initialize the cv2 QRCode detector
detector = cv2.QRCodeDetector()

我们有图像和检测器,让我们检测和解码该数据:

# detect and decode
data, bbox, straight_qrcode = detector.detectAndDecode(img)

所述detectAndDecode()函数拍摄图像作为输入并对其进行解码以恢复3个值元组:从QR码,所找到的QR代码的四边形的顶点的输出数组解码的数据,以及包含整流和二值化的输出图像二维码。

这里我们只需要data和bbox,bbox会帮我们在图片中绘制四边形,数据会打印到控制台!

我们开始做吧,如下Python生成和读取二维码示例:

# if there is a QR code
if bbox is not None:
    print(f"QRCode data:\n{data}")
    # display the image with lines
    # length of bounding box
    n_lines = len(bbox)
    for i in range(n_lines):
        # draw all lines
        point1 = tuple(bbox[i][0])
        point2 = tuple(bbox[(i+1) % n_lines][0])
        cv2.line(img, point1, point2, color=(255, 0, 0), thickness=2)

如何在Python中生成和读取二维码?cv2.line()函数绘制一条连接两个点的线段,我们从之前用detectAndDecode()解码的bbox数组中检索这些点。我们指定了蓝色((255, 0, 0)是蓝色,因为OpenCV使用BGR颜色)和2 的厚度。

最后,让我们显示图像并在按下某个键时退出:

# display the result
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行此命令后,将打印解码数据:

QRCode data:
https://www.thepythoncode.com

并显示以下图像:

如何在Python中生成和读取二维码?实现代码示例

如你所见,蓝线绘制在精确的 QR 码边框中。太棒了,我们已经完成了这个脚本,试着用不同的数据运行它,看看你自己的结果!

请注意,这是二维码的理想选择,而不是条形码,如果你想阅读条形码,请查看专门用于此的教程!

Python如何生成和读取二维码?如果你想使用网络摄像头实时检测和解码 QR 码(我相信你会这样做),请使用以下Python生成和读取二维码示例代码:

import cv2
# initalize the cam
cap = cv2.VideoCapture(0)
# initialize the cv2 QRCode detector
detector = cv2.QRCodeDetector()
while True:
    _, img = cap.read()
    # detect and decode
    data, bbox, _ = detector.detectAndDecode(img)
    # check if there is a QRCode in the image
    if bbox is not None:
        # display the image with lines
        for i in range(len(bbox)):
            # draw all lines
            cv2.line(img, tuple(bbox[i][0]), tuple(bbox[(i+1) % len(bbox)][0]), color=(255, 0, 0), thickness=2)
        if data:
            print("[+] QR Code detected, data:", data)
    # display the result
    cv2.imshow("img", img)    
    if cv2.waitKey(1) == ord("q"):
        break
cap.release()
cv2.destroyAllWindows()

太棒了,我们完成了本教程,你现在可以将其集成到你自己的应用程序中!

查看qrcode 的官方文档

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: