二维码和条码检测技术详解
概述
二维码和条码在现代社会中广泛应用,从商品标签到电子支付,它们成为了信息传递的重要手段。本文将详细介绍如何使用 Python 和 OpenCV 实现二维码和条码的检测。我们将使用 pyzbar
库来解码二维码和条码,并使用 OpenCV 进行图像处理和显示。通过本文的学习,你将能够理解和实现一个完整的二维码和条码检测系统。
环境准备
确保你已经安装了所需的库。如果没有安装,可以使用以下命令进行安装:
pip install opencv-python pyzbar numpy
代码详解
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) # 设置视频宽度
self.cap.set(4, 480) # 设置视频高度
def run(self):
while True:
# 读取摄像头图像
success, img = self.cap.read()
if not success:
print("Failed to read frame from camera.")
break
# 使用 pyzbar 解码图像中的二维码和条码
for bar_code in pyzbar.decode(img):
# 解码结果
print(f"Data: {bar_code.data.decode('utf8')}") # 二维码数据
print(f"Type: {bar_code.type}") # 二维码类型
print(f"Rect: {bar_code.rect}") # 二维码四周边界(矩形框)
print(f"Polygon: {bar_code.polygon}") # 二维码多边形边框
print(f"Quality: {bar_code.quality}") # 二维码质量
print(f"Orientation: {bar_code.orientation}") # 二维码方向
# 绘制二维码或多边形边框
points = np.array(bar_code.polygon, 32)
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, ),
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()
break
if __name__ == '__main__':
code_finder = CodeFinder()
code_finder.run()
代码详解
1. 导入必要的库
import cv2
import numpy as np
from pyzbar import pyzbar
import cv2
:导入 OpenCV 库,用于图像处理和显示。import numpy as np
:导入 NumPy 库,用于数组操作。from pyzbar import pyzbar
:导入 pyzbar 库,用于解码二维码和条码。
2. 定义 CodeFinder
类
class CodeFinder:
"""
二维码、条码检测
"""
def __init__(self):
# 初始化摄像头,设置分辨率
self.cap = cv2.VideoCapture(0)
self.cap.set(3, 640) # 设置视频宽度
self.cap.set(4, 480) # 设置视频高度
__init__
方法初始化摄像头并设置分辨率。self.cap = cv2.VideoCapture(0)
:打开默认摄像头(索引为 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 from camera.")
break
# 使用 pyzbar 解码图像中的二维码和条码
for bar_code in pyzbar.decode(img):
# 解码结果
print(f"Data: {bar_code.data.decode('utf8')}") # 二维码数据
print(f"Type: {bar_code.type}") # 二维码类型
print(f"Rect: {bar_code.rect}") # 二维码四周边界(矩形框)
print(f"Polygon: {bar_code.polygon}") # 二维码多边形边框
print(f"Quality: {bar_code.quality}") # 二维码质量
print(f"Orientation: {bar_code.orientation}") # 二维码方向
# 绘制二维码或多边形边框
points = np.array(bar_code.polygon, 32)
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, ),
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()
break
while True:
:进入无限循环,持续读取摄像头图像。success, img = self.cap.read()
:读取摄像头图像,success
表示读取是否成功,img
是读取的图像。if not success:
:如果读取失败,打印错误信息并退出循环。for bar_code in pyzbar.decode(img):
:使用pyzbar.decode
解码图像中的二维码和条码。print(f"Data: {bar_code.data.decode('utf8')}")
:打印解码后的数据。print(f"Type: {bar_code.type}")
:打印二维码类型。print(f"Rect: {bar_code.rect}")
:打印二维码四周边界(矩形框)。print(f"Polygon: {bar_code.polygon}")
:打印二维码多边形边框。print(f"Quality: {bar_code.quality}")
:打印二维码质量。print(f"Orientation: {bar_code.orientation}")
:打印二维码方向。points = np.array(bar_code.polygon, 32)
:将多边形边框转换为 NumPy 数组。points = points.reshape((-1, 1, 2))
:重塑数组形状。cv2.polylines(img=img, pts=[points], isClosed=True, color=(0, 0, 255), thickness=3)
:在图像上绘制多边形边框。cv2.putText(...)
:在二维码或多边形边框上方绘制解码后的数据。cv2.imshow('code', img)
:显示图像。if cv2.waitKey(1) & 0xFF == ord('q'):
:按下 'q' 键退出循环。self.cap.release()
:释放摄像头资源。cv2.destroyAllWindows()
:关闭所有 OpenCV 窗口。
4. 主程序入口
if __name__ == '__main__':
code_finder = CodeFinder()
code_finder.run()
if __name__ == '__main__':
:确保脚本直接运行时才执行以下代码。code_finder = CodeFinder()
:创建CodeFinder
类的实例。code_finder.run()
:调用run
方法开始检测二维码和条码。
运行效果展示
运行上述代码后,摄像头将开始捕捉图像,并在检测到二维码或条码时,在图像上绘制多边形边框并显示解码后的数据。按下 'q' 键可以退出程序。
总结
本文详细介绍了如何使用 Python 和 OpenCV 实现二维码和条码的检测。通过理解这些基本概念和技术,你可以更加灵活地在图像处理和物体识别中应用 OpenCV 和 pyzbar。