一、实践目标
本项目在行空板上外接USB摄像头,通过摄像头来检测二维码并在屏幕实时显示识别结果。
二、知识目标
学习使用opencv和pyzbar库实现二维码解码。
三、实践准备
硬件清单:
软件使用:Mind+编程软件x1
四、实践过程
1、硬件搭建
1、将摄像头接入行空板的USB接口。
2、通过USB连接线将行空板连接到计算机。
2、软件编写
第一步:打开Mind+,点击终端,远程连接行空板。
第二步:在“项目中的文件”中新建一个名为“main.py”。
第三步:编写程序
双击打开“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”程序,将二维码移入摄像头画面,行空板屏幕中显示二维码识别框和识别内容。
4、程序解析
在上述的“main.py”文件中,我们主要通过opencv库来调用摄像头,获取实时视频流,然后使用pyzbar库中的decode方法检测解析二维码代表的字符串,然后获取识别到二维码的坐标,绘制识别框并实时显示识别内容。整体流程如下,
主程序的流程大致如下:
(1)摄像头初始化:
① 程序使用 cv2.VideoCapture(0) 初始化摄像头,其中参数 0 代表默认的摄像头设备。
② 等待摄像头启动:使用 cap.isOpened() 检查摄像头是否已经成功打开,如果没有,则继续等待。
(2)创建显示窗口:通过 cv2.namedWindow 创建一个名为 "qrwindows" 的窗口,并设置该窗口为全屏显示模式。
(3)主循环:程序进入一个无限循环,用于不断从摄像头捕获图像,并处理图像以检测 二维码。
① 读取图像:使用 cap.read() 从摄像头读取一帧图像。
② 裁剪图像:根据预设的坐标和大小(结合行空板屏幕尺寸),从捕获的图像中裁剪出一个区域,用于后续的二维码检测。
③ 解码二维码:使用 decode 函数对裁剪出的图像区域进行二维码解码。
④ 处理检测结果:
如果检测到二维码,遍历所有检测到的二维码;
对于每个二维码,程序解析其内容并打印到控制台;
程序计算二维码的定位点坐标,并在图像上绘制识别框、连线和定位点;
在识别框上方显示解码出的二维码文本,并暂停观看。
若没有检测到二维码,显示摄像头图像,继续下一次循环。
五、知识园地
了解二维码和二维码扫描处理
二维码是一种快速、便捷的信息传递方式,在我们的日常生活中有着广泛的用途。例如,人们可以无需现金,通过扫描二维码向商家付款;消费者可以通过扫描商品上的二维码获取商品的详细信息,进行商品溯源等。实际上,二维码的种种用途都离不开信息的编码和解码。二维码存储的是一种被编码的信息。这些信息通过编码存储在二维码中,当我们使用手机等读取设备扫描二维码时,设备的相机会捕捉二维码,然后进行解码,最终将编码的信息还原为原始的信息。
二维码是由黑白方块的矩阵组成,通过扫描设备进行识别和解码。识别二维码时会经历图像获取与预处理、定位、分段、解码、解析等过程,如下图。
附件
孙洪尧19852024.07.20
可以使用图形化实现功能吗