在基于计算机视觉的系统中,二维码识别是一种常见的信息提取手段。它广泛应用于物流追踪、生产线扫码、智能门禁、票据验证等场景。借助 OpenCV 中提供的 cv2.QRCodeDetector,我们可以方便地在静态图像和实时视频帧中对二维码进行检测、解码并获取其在图像中的位置。
同时,随着工业视觉平台的兴起,像 PiscTrace 这样的系统为二维码识别的部署与可视化提供了极大的便利。本文将介绍如何基于 OpenCV 实现二维码识别,并在 PiscTrace 中实时执行、渲染标注结果。
🧠 模块概览
1. QRCodeDetector 类
OpenCV 提供的 cv2.QRCodeDetector 支持以下核心功能:
-
detectAndDecode(image):
-
自动检测图像中的二维码区域。
-
解码二维码内容。
-
返回三个值:
-
data:二维码中解码出的文本内容。 -
points:二维码角点坐标,四个点组成闭合四边形。 -
_:二进制编码信息,通常可忽略。
-
-
2. 图像帧格式要求
-
输入图像为
numpy.ndarray类型,OpenCV 默认使用 BGR 通道顺序。 -
图像可来源于摄像头采集、视频流、图像文件或 PiscTrace 中解码后的原始帧。
🔧 检测结果处理流程
二维码识别的典型处理流程如下:
-
二维码检测与解码
使用detectAndDecode(frame)对图像帧进行识别。 -
结果判断与处理
-
若
points is not None且data非空,表示二维码成功识别。 -
points返回一个形如(1, 4, 2)的数组,需使用points[0]取出角点,再转换为整数。
-
-
绘制边界与标注内容
-
使用
cv2.line将角点连接形成二维码边框。 -
使用
cv2.putText在二维码左上角位置写入识别到的内容。
-
🧩 PiscTrace 平台集成优势
PiscTrace 是一个高性能图像处理与渲染平台,支持如下特性:
-
自定义图像处理类:直接支持以
FrameObject.do(frame, device)形式提交自定义逻辑。 -
可视化渲染:平台自动显示处理后的图像结果,适合前端展示与用户交互。
-
区域裁剪 + 贴回机制:可对大幅图像按需裁剪,针对小区域执行二维码识别后贴回,提高精度与性能。
-
多路视图并发执行:适用于多摄像头并发识别应用场景,如智能工厂、物流系统。
✅ 示例:PiscTrace 可直接运行如下逻辑实现二维码检测:
import cv2
class FrameObject:
def __init__(self):
pass
def do(self, frame, device):
qr_detector = cv2.QRCodeDetector() # 放在这里而不是 __init__
data, points, _ = qr_detector.detectAndDecode(frame)
if points is not None and data:
points = points[0].astype(int)
for i in range(len(points)):
pt1 = tuple(points[i])
pt2 = tuple(points[(i + 1) % len(points)])
cv2.line(frame, pt1, pt2, (0, 0, 255), 10)
cv2.putText(frame, data, tuple(points[0]), cv2.FONT_HERSHEY_SIMPLEX,
1, (255, 0, 0), 1)
print(f"[{device}] 识别到二维码内容:{data}")
else:
print(f"[{device}] 未识别到二维码")
return frame

当然,我们还可以使用下列代码将二维码抠出来
import cv2
import numpy as np
class FrameObject:
def __init__(self):
self.counter = 0 # 用来标记二维码的编号
def do(self, frame, device):
qr_detector = cv2.QRCodeDetector() # QRCode检测器
# 检测二维码
data, points, _ = qr_detector.detectAndDecode(frame)
if points is not None and data:
points = points[0].astype(int) # 获取二维码四个角的坐标
# 按顺序排列二维码(四个角坐标)
rect_points = np.array([[0, 0], [300, 0], [300, 300], [0, 300]], dtype="float32")
# 透视变换,矫正二维码的倾斜
matrix = cv2.getPerspectiveTransform(points.astype(np.float32), rect_points)
qr_image = cv2.warpPerspective(frame, matrix, (300, 300))
# 获取二维码框的宽度和高度
x, y, w, h = cv2.boundingRect(points) # 获取二维码的外接矩形框
center = (x + w // 2, y + h // 2) # 计算二维码框的中心位置
# 计算字体大小,使其适应二维码框
font_scale = min(w, h) / 50 # 字体大小与二维码框大小成比例
font_thickness = 2
font = cv2.FONT_HERSHEY_SIMPLEX
# 在原帧内的框中心显示序号
self.counter += 1
cv2.putText(frame, str(self.counter), center, font, font_scale, (255, 0, 0), font_thickness, cv2.LINE_AA)
# 绘制二维码的四个角,做一个可视化标记
for i in range(len(points)):
pt1 = tuple(points[i])
pt2 = tuple(points[(i + 1) % len(points)])
cv2.line(frame, pt1, pt2, (0, 255, 0), 2)
# 在截取的二维码下方标注内容
qr_with_text = np.copy(qr_image) # 复制二维码图像
cv2.putText(qr_with_text, data, (10, qr_image.shape[0] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 2)
# 将矫正后的二维码图像粘贴到原图下方
y_offset = 0
x_offset = 0
frame[y_offset:y_offset + qr_image.shape[0], x_offset:x_offset + qr_image.shape[1]] = qr_with_text
print(f"[{device}] 识别到二维码内容:{data}")
else:
print(f"[{device}] 未识别到二维码")
return frame
📌 应用场景
| 场景 | 描述 |
|---|---|
| 视频监控识别快递单二维码 | 实时采集每一帧并检测快递单上二维码 |
| 工业流水线扫码 | 嵌入至流水线摄像头检测模块中,实现高速识别与追踪 |
| 门禁访客二维码扫描识别 | 实时扫描访客二维码,识别后触发开门/通知逻辑 |
| 手机或嵌入式设备扫描二维码票据 | 用于票务系统或会议签到中的设备集成 |
✅ 总结
基于 OpenCV 的 QRCodeDetector 提供了即插即用的二维码识别能力,结合 PiscTrace 平台的图像裁剪、并发执行、图像渲染和调试日志能力,可以快速部署并可视化二维码识别流程。在实际应用中,结合帧裁剪、识别区域管理与性能调优,可广泛应用于工业、物流、城市智能系统中。
如需进一步构建完整的扫码识别服务,欢迎继续关注下一篇内容:基于 PiscTrace 构建多通道扫码跟踪与统计系统。
对 PiscTrace or PiscCode感兴趣?更多精彩内容请移步官网看看~🔗 PiscTrace

316

被折叠的 条评论
为什么被折叠?



