回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

基于行空板的opencv二维码检测 简单

头像 auroraAA 2024.06.13 136 1

一、实践目标

本项目在行空板上外接USB摄像头,通过摄像头来检测二维码并在屏幕实时显示识别结果。

 

二、知识目标

学习使用opencv和pyzbar库实现二维码解码。

 

三、实践准备

硬件清单:

 

截屏2024-06-13 上午11.55.55.png

 

软件使用:Mind+编程软件x1

 

四、实践过程

1、硬件搭建

1、将摄像头接入行空板的USB接口。

 

image.png

 

2、通过USB连接线将行空板连接到计算机。

 

image.png

 

2、软件编写

第一步:打开Mind+,点击终端,远程连接行空板。

 

image.png

 

第二步:在“项目中的文件”中新建一个名为“main.py”。

 

image.png

 

第三步:编写程序

双击打开“main.py”文件。

示例程序:

代码
import cv2  # 导入OpenCV库
import time  # 导入time库用于处理时间相关功能
import numpy as np  # 导入numpy库,用于处理数值计算
from pyzbar.pyzbar import decode  # 从pyzbar库导入decode函数,用于解码QR码

def main():  # 定义主函数
    cap = cv2.VideoCapture(0)  # 开启摄像头,'0'代表默认的摄像头
    while not cap.isOpened():  # 如果摄像头没有成功开启,则循环等待
        continue
    cap_w, cap_h = 240, 320  # 设置摄像头捕获的图像宽度和高度
    cv2.namedWindow("qrwindows", cv2.WND_PROP_FULLSCREEN)  # 创建一个名为'qrwindows'的窗口
    cv2.setWindowProperty("qrwindows",cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)  # 设置窗口'qrwindows'为全屏显示

    while True:  
        qrimg_success, qrimg_src = cap.read()  # 从摄像头读取一帧图像
        xmin, ymin, w, h = 250, 100, cap_w, cap_h  # 设置要处理的图像区域的位置和大小
        qrimg_src = qrimg_src[ymin:ymin+h, xmin:xmin+w]  # 从摄像头捕获的图像中裁剪指定大小的区域
        qrcode_val = decode(qrimg_src)  # 使用pyzbar的decode函数解码裁剪出的图像中的QR码

        if len(qrcode_val) > 0:  # 如果解码出至少一个QR码
            for i in range(len(qrcode_val)):  # 遍历所有解码出的QR码
                qrcode_str = qrcode_val[i][0].decode()  # 获取QR码的文本内容
                print(qrcode_str)  # 在控制台打印QR码的文本内容
                # 下面的代码获取QR码定位点的坐标,并绘制识别框和定位点
                point_x = qrcode_val[i][2][0]
                point_y = qrcode_val[i][2][1]
                point_w = qrcode_val[i][2][2]
                point_h = qrcode_val[i][2][3]
                point_1_x = qrcode_val[i][3][0][0]
                point_1_y = qrcode_val[i][3][0][1]
                point_2_x = qrcode_val[i][3][1][0]
                point_2_y = qrcode_val[i][3][1][1]
                point_3_x = qrcode_val[i][3][2][0]
                point_3_y = qrcode_val[i][3][2][1]
                point_4_x = qrcode_val[i][3][3][0]
                point_4_y = qrcode_val[i][3][3][1]
                # 绘制识别框
                cv2.rectangle(qrimg_src, (point_x, point_y), (point_x+point_w, point_y+point_h), (255, 0, 255), 2)
                # 绘制定位点之间的连线
                cv2.line(qrimg_src, (point_1_x, point_1_y), (point_2_x, point_2_y), (255, 0, 0), 2, cv2.FILLED)
                cv2.line(qrimg_src, (point_2_x, point_2_y), (point_3_x, point_3_y), (255, 0, 0), 2, cv2.FILLED)
                cv2.line(qrimg_src, (point_3_x, point_3_y), (point_4_x, point_4_y), (255, 0, 0), 2, cv2.FILLED)
                cv2.line(qrimg_src, (point_4_x, point_4_y), (point_1_x, point_1_y), (255, 0, 0), 2, cv2.FILLED)
                # 绘制定位点
                cv2.circle(qrimg_src, (point_1_x, point_1_y), 5, (255, 0, 0), 2)
                cv2.circle(qrimg_src, (point_2_x, point_2_y), 5, (0, 255, 0), 2)
                cv2.circle(qrimg_src, (point_3_x, point_3_y), 5, (0, 0, 255), 2)
                cv2.circle(qrimg_src, (point_4_x, point_4_y), 5, (255, 255, 0), 2)
                # 在识别框上方显示QR码的文本内容
                cv2.putText(qrimg_src,qrcode_str,(point_x,point_y-15), cv2.FONT_HERSHEY_COMPLEX, 0.4, (0, 0, 255), 1)
            cv2.imshow('qrwindows', qrimg_src)  # 在窗口'qrwindows'中显示带有识别框和文本的图像
            cv2.waitKey(10)  
            time.sleep(1)  # 等待1秒
        else:
            cv2.imshow('qrwindows', qrimg_src)  # 如果没有检测到QR码,则在窗口'qrwindows'中显示原始图像
            cv2.waitKey(10)  

if __name__ == '__main__':  # 如果此文件作为主程序运行
    main()  # 调用主函数

3、运行调试

运行“main.py”程序,将二维码移入摄像头画面,行空板屏幕中显示二维码识别框和识别内容。

 

image.png

 

4、程序解析

在上述的“main.py”文件中,我们主要通过opencv库来调用摄像头,获取实时视频流,然后使用pyzbar库中的decode方法检测解析二维码代表的字符串,然后获取识别到二维码的坐标,绘制识别框并实时显示识别内容。整体流程如下,

主程序的流程大致如下:

(1)摄像头初始化:

① 程序使用 cv2.VideoCapture(0) 初始化摄像头,其中参数 0 代表默认的摄像头设备。

② 等待摄像头启动:使用 cap.isOpened() 检查摄像头是否已经成功打开,如果没有,则继续等待。

(2)创建显示窗口:通过 cv2.namedWindow 创建一个名为 "qrwindows" 的窗口,并设置该窗口为全屏显示模式。

(3)主循环:程序进入一个无限循环,用于不断从摄像头捕获图像,并处理图像以检测 二维码。

① 读取图像:使用 cap.read() 从摄像头读取一帧图像。

② 裁剪图像:根据预设的坐标和大小(结合行空板屏幕尺寸),从捕获的图像中裁剪出一个区域,用于后续的二维码检测。

③ 解码二维码:使用 decode 函数对裁剪出的图像区域进行二维码解码。

④ 处理检测结果:

如果检测到二维码,遍历所有检测到的二维码;

对于每个二维码,程序解析其内容并打印到控制台;

程序计算二维码的定位点坐标,并在图像上绘制识别框、连线和定位点;

在识别框上方显示解码出的二维码文本,并暂停观看。

若没有检测到二维码,显示摄像头图像,继续下一次循环。

 

 

五、知识园地

了解二维码和二维码扫描处理

二维码是一种快速、便捷的信息传递方式,在我们的日常生活中有着广泛的用途。例如,人们可以无需现金,通过扫描二维码向商家付款;消费者可以通过扫描商品上的二维码获取商品的详细信息,进行商品溯源等。实际上,二维码的种种用途都离不开信息的编码和解码。二维码存储的是一种被编码的信息。这些信息通过编码存储在二维码中,当我们使用手机等读取设备扫描二维码时,设备的相机会捕捉二维码,然后进行解码,最终将编码的信息还原为原始的信息。

 

image.png

 

二维码是由黑白方块的矩阵组成,通过扫描设备进行识别和解码。识别二维码时会经历图像获取与预处理、定位、分段、解码、解析等过程,如下图。

 

image.png

附件

评论

user-avatar
  • 孙洪尧1985

    孙洪尧19852024.07.20

    可以使用图形化实现功能吗

    0