使用 OpenCV 和 Pyzbar 检测二维码和条码
概述
在现代社会,二维码和条码的应用非常广泛,从商品标签到支付二维码,几乎无处不在。本文将详细介绍如何使用 OpenCV 和 Pyzbar 库在 Python 中检测并识别二维码和条码,并通过具体的代码示例来展示整个过程。
环境准备
在开始之前,请确保已经安装了所需的库。可以通过以下命令进行安装:
pip install opencv-python pyzbar
完整示例代码详解
import cv2
import numpy as np
from pyzbar import pyzbar
class CodeFinder:
"""
二维码、条码检测
"""
def __init__(self):
"""
初始化摄像头并设置分辨率
"""
self.cap = cv2.VideoCapture(0) # 打开默认摄像头
self.cap.set(3, 640) # 设置视频宽度为640像素
self.cap.set(4, 480) # 设置视频高度为480像素
def run(self):
"""
捕获视频并检测二维码和条码
"""
while True:
success, img = self.cap.read() # 读取一帧视频
if not success:
print("Failed to read frame")
break
# 检测图像中的二维码和条码
for bar_code in pyzbar.decode(img):
# 解码二维码数据
print(bar_code.data.decode('utf8')) # 打印二维码数据
print(bar_code.type) # 打印二维码类型
print(bar_code.rect) # 打印二维码四周边界(矩形框)
print(bar_code.polygon) # 打印二维码多边形边框
print(bar_code.quality) # 打印二维码质量
print(bar_code.orientation) # 打印二维码方向
# 绘制二维码边界
points = np.array(bar_code.polygon, np.int32)
points = points.reshape((-1, 1, 2))
cv2.polylines(img=img, pts=[points], isClosed=True, color=(0, 0, 255), thickness=3)
# 在图像上显示二维码数据
cv2.putText(
img=img,
text=bar_code.data.decode('utf8'),
org=(bar_code.rect.left, bar_code.rect.top),
fontFace=cv2.FONT_HERSHEY_SIMPLEX,
fontScale=0.8,
color=(0, 0, 255),
thickness=2
)
# 显示图像
cv2.imshow('code', img)
# 按下 'q' 键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
self.cap.release() # 释放摄像头资源
cv2.destroyAllWindows() # 关闭所有OpenCV窗口
break
if __name__ == '__main__':
code_finder = CodeFinder()
code_finder.run()
代码解析
1. 导入必要的库
import cv2
import numpy as np
from pyzbar import pyzbar
cv2
:OpenCV 的 Python 接口,用于图像和视频处理。numpy
:用于处理图像数据的数组。pyzbar
:用于解码二维码和条码的库。
2. 定义 CodeFinder
类
class CodeFinder:
"""
二维码、条码检测
"""
def __init__(self):
"""
初始化摄像头并设置分辨率
"""
self.cap = cv2.VideoCapture(0) # 打开默认摄像头
self.cap.set(3, 640) # 设置视频宽度为640像素
self.cap.set(4, 480) # 设置视频高度为480像素
- 初始化摄像头:
self.cap = cv2.VideoCapture(0)
:打开默认摄像头(ID 为 0)。self.cap.set(3, 640)
:设置视频宽度为 640 像素。self.cap.set(4, 480)
:设置视频高度为 480 像素。
3. 定义 run
方法
def run(self):
"""
捕获视频并检测二维码和条码
"""
while True:
success, img = self.cap.read() # 读取一帧视频
if not success:
print("Failed to read frame")
break
# 检测图像中的二维码和条码
for bar_code in pyzbar.decode(img):
# 解码二维码数据
print(bar_code.data.decode('utf8')) # 打印二维码数据
print(bar_code.type) # 打印二维码类型
print(bar_code.rect) # 打印二维码四周边界(矩形框)
print(bar_code.polygon) # 打印二维码多边形边框
print(bar_code.quality) # 打印二维码质量
print(bar_code.orientation) # 打印二维码方向
# 绘制二维码边界
points = np.array(bar_code.polygon, np.int32)
points = points.reshape((-1, 1, 2))
cv2.polylines(img=img, pts=[points], isClosed=True, color=(0, 0, 255), thickness=3)
# 在图像上显示二维码数据
cv2.putText(
img=img,
text=bar_code.data.decode('utf8'),
org=(bar_code.rect.left, bar_code.rect.top),
fontFace=cv2.FONT_HERSHEY_SIMPLEX,
fontScale=0.8,
color=(0, 0, 255),
thickness=2
)
# 显示图像
cv2.imshow('code', img)
# 按下 'q' 键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
self.cap.release() # 释放摄像头资源
cv2.destroyAllWindows() # 关闭所有OpenCV窗口
break
-
读取视频帧:
success, img = self.cap.read()
:读取一帧视频。success
表示是否成功读取,img
是读取到的图像。- 如果读取失败,打印错误信息并退出循环。
-
检测二维码和条码:
for bar_code in pyzbar.decode(img)
:使用pyzbar.decode()
函数检测图像中的二维码和条码。print(bar_code.data.decode('utf8'))
:打印二维码数据。print(bar_code.type)
:打印二维码类型。print(bar_code.rect)
:打印二维码四周边界(矩形框)。print(bar_code.polygon)
:打印二维码多边形边框。print(bar_code.quality)
:打印二维码质量。print(bar_code.orientation)
:打印二维码方向。
-
绘制二维码边界:
points = np.array(bar_code.polygon, np.int32)
:将二维码多边形边框转换为 NumPy 数组。points = points.reshape((-1, 1, 2))
:重塑数组形状。cv2.polylines(img=img, pts=[points], isClosed=True, color=(0, 0, 255), thickness=3)
:使用cv2.polylines()
函数绘制多边形边框。
-
在图像上显示二维码数据:
cv2.putText()
:在图像上显示二维码数据。text=bar_code.data.decode('utf8')
:要显示的文本内容。org=(bar_code.rect.left, bar_code.rect.top)
:文本的起始位置。fontFace=cv2.FONT_HERSHEY_SIMPLEX
:使用的字体类型。fontScale=0.8
:字体大小。color=(0, 0, 255)
:文本颜色。thickness=2
:文本线宽。
-
显示图像:
cv2.imshow('code', img)
:显示图像。
-
按键检测:
if cv2.waitKey(1) & 0xFF == ord('q')
:等待1毫秒,如果有按键按下,返回按键的ASCII码。ord('q')
返回字符 ‘q’ 的ASCII码。如果按键为 ‘q’,则退出循环。self.cap.release()
:释放摄像头资源。cv2.destroyAllWindows()
:关闭所有OpenCV窗口。
4. 主函数
if __name__ == '__main__':
code_finder = CodeFinder()
code_finder.run()
- 主函数:
if __name__ == '__main__':
:确保当脚本直接运行时才执行以下代码。- 创建
CodeFinder
对象并调用run
方法来启动二维码和条码检测。
总结
本文详细介绍了如何使用 OpenCV 和 Pyzbar 库在 Python 中检测并识别二维码和条码,并通过具体的代码示例展示了整个过程。通过使用 cv2.VideoCapture()
、pyzbar.decode()
、cv2.polylines()
和 cv2.putText()
等函数,我们可以轻松地处理视频流中的二维码和条码数据。