2024-6-13 16:29:43 [显示全部楼层]
18947浏览
查看: 18947|回复: 0

[教程] 基于行空板的opencv二维码检测

[复制链接]
一、实践目标
本项目在行空板上外接USB摄像头,通过摄像头来检测二维码并在屏幕实时显示识别结果。

二、知识目标
学习使用opencv和pyzbar库实现二维码解码。

三、实践准备
硬件清单:

基于行空板的opencv二维码检测图1

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

四、实践过程
1、硬件搭建
1、将摄像头接入行空板的USB接口。

基于行空板的opencv二维码检测图2

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

基于行空板的opencv二维码检测图3

2、软件编写
第一步:打开Mind+,点击终端,远程连接行空板。

基于行空板的opencv二维码检测图4

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

基于行空板的opencv二维码检测图5

第三步:编写程序
双击打开“main.py”文件。
示例程序:
  1. import cv2  # 导入OpenCV库
  2. import time  # 导入time库用于处理时间相关功能
  3. import numpy as np  # 导入numpy库,用于处理数值计算
  4. from pyzbar.pyzbar import decode  # 从pyzbar库导入decode函数,用于解码QR码
  5. def main():  # 定义主函数
  6.     cap = cv2.VideoCapture(0)  # 开启摄像头,'0'代表默认的摄像头
  7.     while not cap.isOpened():  # 如果摄像头没有成功开启,则循环等待
  8.         continue
  9.     cap_w, cap_h = 240, 320  # 设置摄像头捕获的图像宽度和高度
  10.     cv2.namedWindow("qrwindows", cv2.WND_PROP_FULLSCREEN)  # 创建一个名为'qrwindows'的窗口
  11.     cv2.setWindowProperty("qrwindows",cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)  # 设置窗口'qrwindows'为全屏显示
  12.     while True:  
  13.         qrimg_success, qrimg_src = cap.read()  # 从摄像头读取一帧图像
  14.         xmin, ymin, w, h = 250, 100, cap_w, cap_h  # 设置要处理的图像区域的位置和大小
  15.         qrimg_src = qrimg_src[ymin:ymin+h, xmin:xmin+w]  # 从摄像头捕获的图像中裁剪指定大小的区域
  16.         qrcode_val = decode(qrimg_src)  # 使用pyzbar的decode函数解码裁剪出的图像中的QR码
  17.         if len(qrcode_val) > 0:  # 如果解码出至少一个QR码
  18.             for i in range(len(qrcode_val)):  # 遍历所有解码出的QR码
  19.                 qrcode_str = qrcode_val[i][0].decode()  # 获取QR码的文本内容
  20.                 print(qrcode_str)  # 在控制台打印QR码的文本内容
  21.                 # 下面的代码获取QR码定位点的坐标,并绘制识别框和定位点
  22.                 point_x = qrcode_val[i][2][0]
  23.                 point_y = qrcode_val[i][2][1]
  24.                 point_w = qrcode_val[i][2][2]
  25.                 point_h = qrcode_val[i][2][3]
  26.                 point_1_x = qrcode_val[i][3][0][0]
  27.                 point_1_y = qrcode_val[i][3][0][1]
  28.                 point_2_x = qrcode_val[i][3][1][0]
  29.                 point_2_y = qrcode_val[i][3][1][1]
  30.                 point_3_x = qrcode_val[i][3][2][0]
  31.                 point_3_y = qrcode_val[i][3][2][1]
  32.                 point_4_x = qrcode_val[i][3][3][0]
  33.                 point_4_y = qrcode_val[i][3][3][1]
  34.                 # 绘制识别框
  35.                 cv2.rectangle(qrimg_src, (point_x, point_y), (point_x+point_w, point_y+point_h), (255, 0, 255), 2)
  36.                 # 绘制定位点之间的连线
  37.                 cv2.line(qrimg_src, (point_1_x, point_1_y), (point_2_x, point_2_y), (255, 0, 0), 2, cv2.FILLED)
  38.                 cv2.line(qrimg_src, (point_2_x, point_2_y), (point_3_x, point_3_y), (255, 0, 0), 2, cv2.FILLED)
  39.                 cv2.line(qrimg_src, (point_3_x, point_3_y), (point_4_x, point_4_y), (255, 0, 0), 2, cv2.FILLED)
  40.                 cv2.line(qrimg_src, (point_4_x, point_4_y), (point_1_x, point_1_y), (255, 0, 0), 2, cv2.FILLED)
  41.                 # 绘制定位点
  42.                 cv2.circle(qrimg_src, (point_1_x, point_1_y), 5, (255, 0, 0), 2)
  43.                 cv2.circle(qrimg_src, (point_2_x, point_2_y), 5, (0, 255, 0), 2)
  44.                 cv2.circle(qrimg_src, (point_3_x, point_3_y), 5, (0, 0, 255), 2)
  45.                 cv2.circle(qrimg_src, (point_4_x, point_4_y), 5, (255, 255, 0), 2)
  46.                 # 在识别框上方显示QR码的文本内容
  47.                 cv2.putText(qrimg_src,qrcode_str,(point_x,point_y-15), cv2.FONT_HERSHEY_COMPLEX, 0.4, (0, 0, 255), 1)
  48.             cv2.imshow('qrwindows', qrimg_src)  # 在窗口'qrwindows'中显示带有识别框和文本的图像
  49.             cv2.waitKey(10)  
  50.             time.sleep(1)  # 等待1秒
  51.         else:
  52.             cv2.imshow('qrwindows', qrimg_src)  # 如果没有检测到QR码,则在窗口'qrwindows'中显示原始图像
  53.             cv2.waitKey(10)  
  54. if __name__ == '__main__':  # 如果此文件作为主程序运行
  55.     main()  # 调用主函数
复制代码

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

基于行空板的opencv二维码检测图7

4、程序解析
在上述的“main.py”文件中,我们主要通过opencv库来调用摄像头,获取实时视频流,然后使用pyzbar库中的decode方法检测解析二维码代表的字符串,然后获取识别到二维码的坐标,绘制识别框并实时显示识别内容。整体流程如下,
主程序的流程大致如下:
(1)摄像头初始化:
① 程序使用 cv2.VideoCapture(0) 初始化摄像头,其中参数 0 代表默认的摄像头设备。
② 等待摄像头启动:使用 cap.isOpened() 检查摄像头是否已经成功打开,如果没有,则继续等待。
(2)创建显示窗口:通过 cv2.namedWindow 创建一个名为 "qrwindows" 的窗口,并设置该窗口为全屏显示模式。
(3)主循环:程序进入一个无限循环,用于不断从摄像头捕获图像,并处理图像以检测 二维码。
① 读取图像:使用 cap.read() 从摄像头读取一帧图像。
② 裁剪图像:根据预设的坐标和大小(结合行空板屏幕尺寸),从捕获的图像中裁剪出一个区域,用于后续的二维码检测。
③ 解码二维码:使用 decode 函数对裁剪出的图像区域进行二维码解码。
④ 处理检测结果:

如果检测到二维码,遍历所有检测到的二维码;
对于每个二维码,程序解析其内容并打印到控制台;
程序计算二维码的定位点坐标,并在图像上绘制识别框、连线和定位点;
在识别框上方显示解码出的二维码文本,并暂停观看。
若没有检测到二维码,显示摄像头图像,继续下一次循环。


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

基于行空板的opencv二维码检测图6

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

基于行空板的opencv二维码检测图8




代码.zip

168.11 KB, 下载次数: 25

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail