在PiscTrace快速实现视频帧中的二维码识别与图像标注

在基于计算机视觉的系统中,二维码识别是一种常见的信息提取手段。它广泛应用于物流追踪、生产线扫码、智能门禁、票据验证等场景。借助 OpenCV 中提供的 cv2.QRCodeDetector,我们可以方便地在静态图像和实时视频帧中对二维码进行检测、解码并获取其在图像中的位置。

同时,随着工业视觉平台的兴起,像 PiscTrace 这样的系统为二维码识别的部署与可视化提供了极大的便利。本文将介绍如何基于 OpenCV 实现二维码识别,并在 PiscTrace 中实时执行、渲染标注结果。


🧠 模块概览

1. QRCodeDetector 类

OpenCV 提供的 cv2.QRCodeDetector 支持以下核心功能:

  • detectAndDecode(image)

    • 自动检测图像中的二维码区域。

    • 解码二维码内容。

    • 返回三个值:

      • data:二维码中解码出的文本内容。

      • points:二维码角点坐标,四个点组成闭合四边形。

      • _:二进制编码信息,通常可忽略。

2. 图像帧格式要求

  • 输入图像为 numpy.ndarray 类型,OpenCV 默认使用 BGR 通道顺序。

  • 图像可来源于摄像头采集、视频流、图像文件或 PiscTrace 中解码后的原始帧。


🔧 检测结果处理流程

二维码识别的典型处理流程如下:

  1. 二维码检测与解码
    使用 detectAndDecode(frame) 对图像帧进行识别。

  2. 结果判断与处理

    • points is not Nonedata 非空,表示二维码成功识别。

    • points 返回一个形如 (1, 4, 2) 的数组,需使用 points[0] 取出角点,再转换为整数。

  3. 绘制边界与标注内容

    • 使用 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值