二维码结构与检测
标准的二维码结构如下所示:

特别需要注意的是图中三个黑色正方形区域,它们是用于定位二维码的最关键区域。我们在进行二维码扫描检测时,首要任务就是识别这三个区域。一旦成功找到这三个区域,就意味着我们已经成功检测到一个二维码,可以进行定位与识别了。这三个角上的正方形区域从左到右,从上到下的黑白比例为1:1:3:1:1。不管角度如何变化,这个特征是最显著的,通过这个特征我们可以实现二维码的扫描检测与定位。

立即学习“Python免费学习笔记(深入)”;
使用Python语言生成二维码其实非常简单,有一个纯Python的二维码生成包,地址和安装执行命令如下:
然后执行如下代码即可生成二维码,代码示例如下:
image = qrcode.make('hello, qrcode')
image.save('test.png')使用zbar进行二维码解析时需要注意,标准的zbar不支持Python3,这是一个较大的问题。幸运的是,有一位开发者在zbar的基础上进行了封装,开发了pyzbar包,支持Python2和Python3,非常实用。安装非常简单,Windows下一条命令即可搞定,Linux和Mac OS则需要先安装zbar然后再执行此命令。
解析接口支持PIL/Pillow图像、OpenCV/numpy数组和原始字节等多种格式,这意味着可以与OpenCV无缝对接,OpenCV读取的图像可以直接用于解析。示例如下:

解析结果分为四个部分,分别为:
外接矩形与多边形状表示如下:

其中,蓝色矩形表示外接矩形,粉色表示多边形的四个点坐标。
二维码检测与解析示例如下,其中QRcodeDetector是我基于二值图像轮廓分析实现的二维码检测类。该类支持各种纠偏、倾斜和放缩的二维码检测,同时对检测到的二维码区域进行ROI截取,然后使用zbar进行二维码解析,输出二维码解析数据内容。导入的包与初始化代码如下:
import qrcode
from pyzbar.pyzbar import decode
from qrcode_demo.qrcode_detector import QRcodeDetector
import cv2 as cv
import numpy as np
qr_detector = QRcodeDetector()
image = qrcode.make('hello, qrcode')
image.save('test.png')
result = decode(cv.imread('test.png'))
print(result[0][3])静态图像二维码检测与解析的代码如下:
def image_detect():
src = cv.imread("D:/images/wechat_id.jpg")
result, code_image = qr_detector.detect(src)
text_content = decode(code_image)
if text_content is not None:
print("content : %s"% text_content[0][0])
cv.imshow("input", src)实时视频二维码检测与解析的代码如下:
def video_detect():
capture = cv.VideoCapture(0)
height = capture.get(cv.CAP_PROP_FRAME_HEIGHT)
width = capture.get(cv.CAP_PROP_FRAME_WIDTH)
out = cv.VideoWriter("D:/qrcode_demo.mp4", cv.VideoWriter_fourcc('D', 'I', 'V', 'X'), 15,
(np.int(width), np.int(height)), True)
while True:
ret, frame = capture.read()
if ret is True:
frame = cv.flip(frame, 1)
cv.imshow("frame", frame)
result, code_image = qr_detector.detect(frame)
if code_image is not None:
text = decode(code_image)
if len(text) > 0:
cv.putText(result, text[0][0].decode("utf-8"), (20, 100), cv.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 2, 8)
cv.imwrite("D:/result.png", result)
print(text[0][0].decode("utf-8"))
out.write(result)
cv.imshow("result", result)
c = cv.waitKey(5)
if c == 27:
break
else:
break
cv.waitKey(0)
cv.destroyAllWindows()效果展示如下:


以上就是干货 | 基于OpenCV Python实现二维码检测与识别的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号