动态识别二维码(树莓派4b + python3 + pyzbar + opencv + 摄像头)

前言

        最近需要做一个工训物料小车扫码领取任务的功能,于是使用树莓派的摄像头扫码二维码。经过我的多番寻找,发现有个叫pyzbar的库,可以结合opencv,可以做一个视频动态二维码扫描

        本文实现的功能:实现树莓派的二维码扫描

1. 首先安装opencv和pyzbar

        opencv的安装,这里就不再赘述,没有在树莓派上安装opencv的,可以参考一下这篇博客:树莓派4 安装OPENCV3全过程

        pyzbar的安装,直接树莓派终端上使用如下命令即可

pip3 install pyzbar

2. 代码及注释

        我使用的是树莓派的csi摄像头,而不是usb摄像头,具体树莓派摄像头一开始如何调试,如何获取视频源,可以参考这篇文章:树莓派OpenCV系列教程2:摄像头的基本使用

import time
import cv2
import numpy as np
import pyzbar.pyzbar as pyzbar


# main函数
if __name__ == '__main__':
    # openCV 字体
    font = cv2.FONT_HERSHEY_SIMPLEX
    # 定义图像源
    cap = cv2.VideoCapture("http://admin:admin@192.168.1.15:8081/")  # 0: use CSI camera,1:use USB camera
    cap.set(3, 480)  # set Width把视频流的帧(图片)的宽度调成480
    cap.set(4, 360)  # set Height把视频流的帧(图片)的高度调成480
    if (not cap.isOpened()):
        print("[camera.py:cam]:can't open this camera")

    while (cap.isOpened()):
        # 读入图片
        ret, img = cap.read()
        # 转灰度
        img_ROI_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

        # 解码 返回了识别到的多个二维码对象
        barcodes = pyzbar.decode(img_ROI_gray)

        # 对于每个识别到的二维码区域
        for barcode in barcodes:
            # 条形码数据为字节对象,所以如果我们想在输出图像上
            # 画出来,就需要先将它转换成字符串
            barcodeData = barcode.data.decode("utf-8")
            barcodeType = barcode.type
            text = "{} ({})".format(barcodeData, barcodeType)

            # 打印字符在图片上
            cv2.putText(img, text, (20, 100), font, 1, (0, 255, 0), 4)
            # 向终端打印条形码数据和条形码类型
            print("[INFO] Found {} barcode: {}".format(barcodeType, barcodeData))

        # 显示
        # cv2.imshow('img_ROI', img_ROI_gray)
        cv2.namedWindow('image', 0)
        cv2.resizeWindow('image', 700, 900)
        cv2.imshow('image', img)
        if (cv2.waitKey(1)) == 27:
            break
        # 进程停止0.5秒,为了降低图像识别的帧率,提升性能
        time.sleep(0.5)
    # 释放资源
    cap.release()
    cv2.destroyAllWindows()

        代码的功能是在循环内,每0.5秒,获取一帧图像,然后调用pyzbar识别二维码,然后把二维码信息打印在图像上, 并将图像显示出来。

3. 效果

        效果图如下:

 不晓得为什么效果不太好,延迟很高。。。

4. 优化

优化之后的代码延迟很低,不卡啦

# coding:utf8

import cv2
import pyzbar.pyzbar as pyzbar


def decodeDisplay(image,image1):
    barcodes = pyzbar.decode(image)
    for barcode in barcodes:
        # 提取条形码的边界框的位置
        # 画出图像中条形码的边界框
        (x, y, w, h) = barcode.rect
        cv2.rectangle(image1, (x, y), (x + w, y + h), (0, 0, 255), 2)

        # 条形码数据为字节对象,所以如果我们想在输出图像上
        # 画出来,就需要先将它转换成字符串
        barcodeData = barcode.data.decode("utf-8")
        barcodeType = barcode.type

        # 绘出图像上条形码的数据和条形码类型
        text = "{} ({})".format(barcodeData, barcodeType)
        cv2.putText(image1, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX,
                    .5, (0, 0, 125), 2)

        # 向终端打印条形码数据和条形码类型
        print("[INFO] Found {} barcode: {}".format(barcodeType, barcodeData))
    return image1


def detect():
    cap = cv2.VideoCapture(0)

    while True:
        # 读取当前帧
        ret, img = cap.read()
        # 转为灰度图像
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        im = decodeDisplay(gray,img)

        key = cv2.waitKey(5)
        cv2.namedWindow('image', 0)
        cv2.resizeWindow('image', 700, 500)
        cv2.imshow("image", im)
        if key == 27:
            break

    cap.release()
    cv2.destroyAllWindows()


if __name__ == '__main__':
    detect()

  • 7
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
OpenCV 是一个开源的计算机视觉库,可以用于实现许多图像和视频处理的任务。而 Jetson 是 NVIDIA 推出的一款高性能嵌入式计算平台,用于加速人工智能应用程序的开发和部署。 使用 OpenCV 实现通过摄像头识别二维码可以通过以下步骤来实现: 1. 首先,需要在 Jetson 上安装 OpenCV 库和相机驱动程序。可以通过 JetPack 以及 OpenCV 的官方文档进行安装和配置。 2. 在程序中导入 OpenCV 库,并创建一个 VideoCapture 对象,用于打开摄像头并捕获视频帧。 3. 使用循环来不断读取摄像头捕获的帧,并对每一帧进行二维码的检测。可以使用 OpenCV 中的 QRCodeDetector 类来实现,该类提供了对二维码的解码和检测功能。 4. 对每个检测到的二维码进行解码,获取二维码内容。可以通过调用 QRCodeDetector 类中的 detectAndDecode 方法来实现。 5. 在屏幕上显示二维码内容或将内容保存到文件中,以便后续使用。 需要注意的是,使用 Jetson 进行图像处理可能需要使用 GPU 加速来提高性能,可以通过 OpenCV 的 GPU 模块或使用 CUDA 来实现。另外,为了提高二维码的检测效果,可以根据实际情况进行参数的调整,如调整二维码的大小范围、检测的灵敏度等。 总结起来,通过在 Jetson 上使用 OpenCV 库和相机驱动程序,可以方便地实现通过摄像头识别二维码的功能。这可以在许多应用场景中使用,如物流追踪、社交媒体分享、支付扫码等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汽水啤酒花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值