• 正文
  • 相关推荐
申请入驻 产业图谱

如何使用树莓派+OpenCV实时扫描并存储二维码?

08/27 10:18
1118
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

大家好,这是一个树莓派和OpenCV的连载专题。今天的内容是:使用树莓派+OpenCV实时扫描并存储二维码

如果大家喜欢这个专题,记得关注树莓派开发者,这样你将会第一时间收到我们的内容更新通知。

考验你英语听力的时候到了,你可以选择观看视频演示。

[更新——在OPEN-CV与新的树莓派“Bullseye”操作系统完全兼容之前,我强烈建议现阶段将之前的树莓派“Buster”操作系统刷写到Micro-SD卡上,以便使用本指南]

如何将旧的“Buster”树莓派系统刷写到Micro-SD卡上:

https://core-electronics.com.au/guides/raspberry-pi/flash-buster-os-pi/

官方“Buster”镜像:

https://downloads.raspberrypi.org/raspios_armhf/images/raspios_armhf-2021-05-28/

你是否曾希望让树莓派4 Model B主动搜索、识别并记录任何二维码的数据?或者使用二维码控制GPIO引脚?那你就来对地方了。

在现代社会,二维码(快速响应码)无处不在,这是有充分理由的。二维码与条形码有很多相似之处,但识别二维码使用的是摄像头而非激光,通过识别方块标记之间的空白区域来读取信息。二维码能够编码由黑白方块表示的数据,用途极为广泛,借助机器学习技术,解码二维码(人眼无法识别)中的秘密也变得前所未有的简单。然后,根据你使用的软件,你可以实时显示输出结果,将信息发送进行处理,让它引导你访问网站,或者做任何你想做的事情。

那么,让我们用树莓派实时查看大量二维码,实时显示其数据,然后将信息捕获并存储到文本/Excel兼容的文件中。接下来,我们可以更进一步,使用特定的二维码来控制树莓派单板计算机的GPIO引脚。

本指南的内容如下:

  • 所需材料
  • 硬件设置
  • 软件设置
  • 二维码识别与解码代码及演示
  • 二维码输出CSV数据及演示
  • 后续方向(GPIO控制)

下载资源

二维码可以编码多种数据类型,包括数字、字符和二进制数据,这为许多创意应用提供了可能。广告商经常使用二维码来编码网址,将用户重定向到他们的网站。公司将重要的产品信息(如序列号)编码在二维码中,并将其附加到组件上。在澳大利亚,进入企业时经常需要扫描二维码。二维码有多种标准和类型,但本系统适用于所有常见类型。使用本生成器创建的任何自定义二维码均可被我们的树莓派系统读取。

本系统将使用Open-CV,这是一个强大的资源库,有助于解决实时计算机视觉和图像处理问题。下图展示了树莓派摄像头在实时流中识别二维码的场景,摄像头在二维码周围绘制了一个蓝色方框,成功读取数据,并在二维码上方写出了数据内容。

所需材料

下图是树莓派Model B的图片,旁边列出了让本系统快速运行所需的组件。

树莓派4 Model B(这款树莓派提供的额外计算能力对这项任务非常有帮助)

树莓派官方摄像头模块V2(你也可以使用树莓派高清摄像头和镜头)

Micro SD卡

电源

显示器

HDMI线

鼠标和键盘

硬件设置

要在树莓派上快速实现物体识别,可以按照以下步骤操作。首先,将一张新的树莓派“Buster”操作系统镜像刷写到Micro-SD卡上。将刷写好的Micro-SD卡插入树莓派。然后,确保将树莓派连接到显示器,连接好外设(键盘和鼠标),并正确安装树莓派摄像头,确保排线方向正确。最后,插入USB-C线为系统供电。下图展示了所有连接好的硬件和插头。

一旦通过USB-C插头为树莓派供电,它就会开始启动。启动序列完成后,你将看到树莓派操作系统和熟悉的吴哥窟背景。你还可以在下图中看到指向互联网连接按钮的箭头。使用右上角的WIFI符号将系统连接到互联网。

然后,打开树莓派配置菜单(通过左上角的菜单按钮,即带有树莓派图标的按钮,然后滚动到“首选项”找到)。在这个菜单中,在“接口”选项卡下启用摄像头,设置位置见下图。启用后,重置你的树莓派。

软件设置

为了使本系统正常工作,我们将集成强大的Open-CV软件和二维码系统代码。Open-CV是一个强大的资源库,有助于解决实时计算机视觉和图像处理问题。要在树莓派终端上安装它,我们将输入并执行以下命令。使用屏幕左上角的黑色按钮打开一个新终端。下图展示了在树莓派“Buster”操作系统中打开终端的样子,箭头指向用鼠标点击的图标。

在终端中,我们将输入并执行以下命令。如果提示,请输入| Y |并按回车键继续安装过程。安装每个软件包应不超过4分钟。下图展示了正在下载的第二行命令。这里的大多数命令都以| sudo |开头(这意味着每条命令都将以管理员权限运行),用于更新和安装所有当前软件包到当前设置。

sudo apt-get updatesudo apt-get install python3-opencvsudo apt-get install libqt4-test python3-sip python3-pyqt5 libqtgui4 libjasper-dev libatlas-base-dev -ypip3 install opencv-contrib-python==4.1.0.25sudo modprobe bcm2835-v4l2

这些就是本应用所需的所有软件包。运行快速重启以锁定所有这些更改。

二维码识别与解码代码及演示

在本节中,我们将使用树莓派分析来自树莓派摄像头的实时流,以查找二维码。当找到二维码时,它会在二维码周围绘制一个蓝色方框,然后将解码后的二维码数据以纯文本形式写在方框上方。我们将能够在树莓派上看到的实时流将主动搜索二维码,当找到二维码时,它将类似于下图的屏幕截图。

以下是实现这一功能的代码,并附有详细注释。无需下载额外软件包即可成功运行此代码。你只需在Thonny IDE(或任何你喜欢的Python解释器)中打开它(或复制、粘贴并保存)。然后,打开代码,按绿色运行按钮运行。你也可以在本页底部下载此代码。

#most importantly for this code to run is to import OpenCV which we do in the below lineimport cv2# set up camera object called Cap which we will use to find OpenCVcap = cv2.VideoCapture(0)# QR code detection Methoddetector = cv2.QRCodeDetector()#This creates an Infinite loop to keep your camera searching for data at all timeswhile True:    # Below is the method to get a image of the QR code    _, img = cap.read()    # Below is the method to read the QR code by detetecting the bounding box coords and decoding the hidden QR data     data, bbox, _ = detector.detectAndDecode(img)    # This is how we get that Blue Box around our Data. This will draw one, and then Write the Data along with the top (Alter the numbers here to change the colour and thickness of the text)    if(bbox is not None):        for i in range(len(bbox)):            cv2.line(img, tuple(bbox[i][0]), tuple(bbox[(i 1) % len(bbox)][0]), color=(255,                     0, 0), thickness=2)        cv2.putText(img, data, (int(bbox[0][0][0]), int(bbox[0][0][1]) - 10), cv2.FONT_HERSHEY_SIMPLEX,                    1, (255, 250, 120), 2)        #Below prints the found data to the below terminal (This we can easily expand on to capture the data to an Excel Sheet)        #You can also add content to before the pass. Say the system reads red it'll activate a Red LED and the same for Green.        if data:            print("data found: ", data)            if data == 'red':                pass            if data == 'green':                pass    # Below will display the live camera feed to the Desktop on Raspberry Pi OS preview    cv2.imshow("code detector", img)    #At any point if you want to stop the Code all you need to do is press 'q' on your keyboard    if(cv2.waitKey(1) == ord("q")):        break    # When the code is stopped the below closes all the applications/windows that the above has createdcap.release()cv2.destroyAllWindows()

一旦运行代码,它将主动搜索二维码。当找到二维码并捕获数据时,它会将数据写入Shell,这在下一步中将有助于以CSV(逗号分隔值)格式记录信息。它还会在实时流中围绕二维码绘制一个方框,并在方块上方写出数据。下图展示了当树莓派从二维码中捕获信息时你应该看到的屏幕截图,注意绿色运行按钮。

二维码输出CSV数据及演示

此代码将执行与之前相同的功能,但这次它将获取记录的信息并将其存储在Excel可轻松读取的文本文件格式中。使用的格式将是CSV,每个二维码的数据、日期和时间戳都将记录到文本文件中。要使用以下代码捕获此信息,你需要一个名为| Database.csv |的文本文件,该文件应保存在与代码相同的目录中(在我的情况下是桌面)。用于执行此操作的代码如下。你可以在本页底部的下载部分找到名为| QR-Simple-Code-With-CSV.py |的代码和一个正确命名的空白文本文件。

Code is similar to before but note the Adding Time section and the CSV Write control#most importantly for this code to run is to import OpenCVimport cv2import csv#adding time and date stuff and rearranging itfrom datetime import date, datetimetoday = date.today()date = today.strftime("%d-%b-%Y")now = datetime.now()timeRN = now.strftime("%H:%M:%S")# set up camera object called Cap which we will use to find OpenCVcap = cv2.VideoCapture(0)# QR code detection Methoddetector = cv2.QRCodeDetector()#This creates an Infinite loop to keep your camera searching for data at all timeswhile True:    # Below is the method to get a image of the QR code    _, img = cap.read()    # Below is the method to read the QR code by detetecting the bounding box coords and decoding the hidden QR data     data, bbox, _ = detector.detectAndDecode(img)    # This is how we get that Blue Box around our Data. This will draw one, and then Write the Data along with the top    if(bbox is not None):        for i in range(len(bbox)):            cv2.line(img, tuple(bbox[i][0]), tuple(bbox[(i 1) % len(bbox)][0]), color=(255,                     0, 0), thickness=2)        cv2.putText(img, data, (int(bbox[0][0][0]), int(bbox[0][0][1]) - 10), cv2.FONT_HERSHEY_SIMPLEX,                    1, (255, 250, 120), 2)        #Below prints the found data to the below terminal (This we can easily expand on to capture the data to an Excel Sheet)        #You can also add content to before the pass. Say the system reads red it'll activate a Red LED and the same for Green.        if data:            print("data found: ", data, date, timeRN)       #**** This location is where we are adding the ability for the code to capture the Data and write it to a Text file       #For this here we are writing the Information to Database.csv File located in the same directory (the desktop) as this code.                 with open('Database.csv', mode='a') as csvfile:                csvfileWriter = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL)                csvfileWriter.writerow([data, date, timeRN])                if data == 'red':                pass            if data == 'green':                pass    # Below will display the live camera feed to the Desktop on Raspberry Pi OS preview    cv2.imshow("code detector", img)    #At any point if you want to stop the Code all you need to do is press 'q' on your keyboard    if(cv2.waitKey(1) == ord("q")):        break    # When the code is stopped the below closes all the applications/windows that the above has createdcap.release()cv2.destroyAllWindows()

下图展示了运行上述代码扫描二维码时将发生的场景。

后续方向(GPIO控制)

接下来的自然步骤是使用二维码来激活树莓派上的GPIO引脚。例如,如果二维码中嵌入了| Red |数据,当树莓派识别出该二维码时,它将点亮一个红色LED。我们将在本节中实现这一点,但请理解,这个LED只是任何事物的占位符!GPIO引脚是控制几乎无限数量传感器电机执行器、硬件的门户。你的好奇心将决定你将用它做什么。正如你在下图中所见,我将在代码的顶部和下部添加以下行。你也可以在本页底部简单下载此完整代码。

现在,将两个LED(两个LED均串联匹配电阻)连接到树莓派的接地引脚和GPIO引脚8和GPIO引脚4。然后,每当你运行代码并向其展示编码有| Red |或| Green |的二维码数据时,它们就会亮起来!下图展示了此设置运行的场景以及所用面包板的清晰俯视图。

《树莓派工作坊》第二章提供了一个很好的指南,从基础层面解释了代码以及为什么进行某些连接。GPIO(通用输入输出)是让你的树莓派与外界连接的接口。这可以是任何形式的控制,你的想象力是唯一的限制。

https://core-electronics.com.au/guides/courses/raspberry-pi-workshop-for-beginners/

下载资源

以下是运行上述示例所需的所有代码。这些代码已附有详细注释,因此你可以轻松理解并修改它们,以满足你的特定需求。

附件:https://core-electronics.com.au/media/kbase/504/Simple-OPENCV-QR-Code-Scripts.zip

很多人一直以为树莓派(Raspberry Pi)只是创客圈子里的小玩具——一块信用卡大小的开发板,用来点亮 LED、跑个 Python 脚本、或者给中学生上一堂入门编程课。然而,事实远比想象震撼:树莓派已经悄悄完成了从“教学演示”到“工业级主力”的华丽转身,正在产线、机房、实验室甚至外太空里 7×24 小时不间断服役。

如果觉得我们的内容不错,记得点赞+收藏+关注+转发~ 我们很乐意为您提供工业树莓派的解决方案,项目有需求请联系我们~ www.edatec.cn/cn

上海晶珩电子科技有限公司

上海晶珩电子科技有限公司

工业树莓派制造商,树莓派官方设计合作伙伴和官方代理商。

工业树莓派制造商,树莓派官方设计合作伙伴和官方代理商。收起

查看更多

相关推荐