【行空板】用Python玩转开源硬件-第15课 AIoT社区车位共享系统
本帖最后由 JIAJIA 于 2023-4-28 10:33 编辑AIoT社区车位共享系统
随着城市的不断发展,停车问题也变得越来越棘手。对于想要找到合适停车位的司机来说,“车位已满”无疑是最让人头痛的。那么,如何解决“停车难”这个问题呢?最佳的方法之一是共享闲置车位,让车位“活起来”,为车主们提供更多停车选择。因此,社区应该考虑将闲置车位开放出来,这样可以缓解停车难的问题。
接下来,就使用行空板制作一款AIoT社区车位共享系统,社区工作人员将闲置车位信息发布出来,车主接收到闲置车位信息后,即可发送车牌号并申请停车。
任务目标
社区工作人员可以通过服务端发布当前可用的停车位信息。当移动设备上的车主接收到可用车位信息后,可以向服务器上传自己的车牌信息,并发送占用车位请求。智能终端会接收并存储移动终端的车牌信息,当摄像头识别到该车牌号时,系统会自动打开闸机门,使车主可以顺利进入停车位。
注意:智能终端和服务器端使用的是同一块行空板。
https://www.bilibili.com/video/BV1zL411Y7uD/?share_source=copy_web&vd_source=98de4a48f0ea2e3d30571e3541e90d99
知识点
1. 了解摄像头识别车牌号原理及使用方法
2. 学习AIoT在实际生活中的应用
材料清单
硬件清单:
软件使用:Mind+编程软件(V1.8.0) x1
注意:由于本节课要使用Mind+可视化面板,需要将行空板SIoT服务升级为2.0版本。对应版本的Mind+和SIoT2.0升级文件,都可以进入下面链接下载:
https://mindplus.dfrobot.com.cn/dashboard_kit0194
动手实践
AIoT社区车位共享系统,主要是用于社区工作者共享车位,车主用户接收到共享信息后,上传自己的车牌号,并请求使用车位。当车主要进入社区进行停车时,社区闸机门自动开启。因此,主要从以下四个任务来完成AIoT社区车位共享系统的制作。
任务一:车牌自动识别闸机
按下按钮A,USB摄像头对车牌号进行识别,识别到车牌号为登记过的车牌号时,自动打开闸机门。
任务二:搭建服务器端
搭建一个简单的空余车位发布界面,用于社区管理员对外发布空余车位消息。
任务三:搭建移动终端
移动终端用于用户接收空余车位信息,接收到信息后,如果要使用该车位,可以通过请求使用按钮,向服务器端发送自己的车牌号。
任务四:搭建智能终端
智能终端用于接收并存储服务端上的车牌号,当识别结果为登记过的车牌号时,开启闸机门。
任务一:车牌识别闸机
1. 硬件连接
将摄像头连接到行空板的USB端口,将舵机连接到行空板的P23引脚,硬件连接成功后,使用USB线将行空板连接到计算机。
2. 软件准备
打开Mind+,按照下面图示完成软件准备工作。
3. 编写程序
(1)加载车牌识别库
连接行空板10.1.2.3远程终端后,在“素材”文件中找到“Chinese_license_plate_detection_recognition”文件夹,并将该文件夹导入“行空板中的文件”。
要在行空板中使用车牌号识别库,首先需要想安装依赖库。安装依赖库的方法如下:点击“代码”切换编程模式,在导入文件夹中,找到“1-Install_dependency.py”并双击,然后点击运行。
安装完成后,点击“模块”,切换为图形化编程。然后导入车牌识别库,点击“扩展”,在“用户库”中输入网址:https://gitee.com/chenqi1233/ext ... tection_recognition检索,点击“车牌识别”,完成添加。
如果车牌的识别结果是本社区的车辆,就控制闸机门打开。利用舵机模拟闸机门的开启,导入舵机库,点击“扩展”,在“pinpong库”中找到“舵机”并点击,完成添加。
(2)车牌号识别
添加好车牌识别库后,就可以使用指令和USB摄像头来识别车牌号了。首先使用初始化摄像头直到成功 编号0,初始化摄像头。
摄像头初始化成功后,使用打开摄像头画面进行读取指令,读取摄像头中的画面。
按下按钮A,对摄像头中的车牌号进行识别。使用条件判断指令,判断按钮A是否被按下。
当判断条件为真时,使用开始进行车牌识别指令,对车牌号进行识别,最后使用打印指令,将识别结果打印在Mind+终端上。
注意:关于“车牌号识别”的相关原理,见知识园地。
(3)控制闸机门
社区工作人员对社区内的车辆做了一个车辆信息表,登记的车牌号信息如下:
使用列表来存储登记的车牌号,新建变量车牌信息列表,并使用初始化列表指令,将变量车牌信息赋值为列表,最后在列表中填写车牌号。
注意:列表中填写的车牌号需要放在英文状态下的引号中,并以英文状态下的逗号进行分隔。
然后在Python主程序开始指令下,使用舵机初始化指令,初始化舵机引脚为P23;然后使用舵机转动角度指令,设置舵机角度为10度(模拟闸机门关闭)。
如何才能判断该车辆是否属于本社区呢?使用条件判断语句,判断识别结果是否为列表中的车牌号。使用for循环指令,将列表中的车牌号取出来与识别结果进行比对。
当判断结果为真时,使用舵机转动指令,设置舵机转动角度为100度(开启闸机门)。等待3秒后,当车辆驶过闸机门,再设置舵机转动角度为10度(关闭闸机门)。
4. 程序运行
点击运行,程序运行成功后,就可以开始车牌号识别了。按下按钮A,开始车牌识别,当识别的车牌号是社区登记的车牌号时,闸机门自动打开,3秒后闸机门自动关闭。
注意:素材文件中提供了车牌号图,使用时可直接打印。
任务二:搭建服务器端
社区车位共享系统中,需要使用两块行空板。一块行空板作为社区工作人员发布信息的服务器端与识别车牌号控制闸机门的智能终端,一块行空板作为用户使用的移动终端。这个任务,我们先来完成服务器端的搭建。
1. 编写程序
服务器端的主要功能,是实现社区工作者对车主们发布空余车位信息。因此,直接使用Mind+“可视化面板”设计一个简单的发送界面。
(1)搭建服务器端
将电脑和两块行空板接入同一网段,并开启“服务器端”行空板物联网服务(SIoT2.0)。
注意:多行空板连接入同一网络、查看网络信息等操作方法,可以参考网址中的教程描述(https://mc.dfrobot.com.cn/thread-314805-1-1.html)。
接下来,进入物联网平台,创建所需的主题,本项目包含空余车位数、车牌信息两个主题。
(2)新建项目
点击Mind+上方的“可视化面板”按钮,开启“Mind+数据可视化窗口”。
点击“新建空白项目”,在弹出窗口中填写好项目名称,点击“确定”项目管理页面就会出现新建项目标签。
(3)连接SIoT
新建好项目后,点击对应标签上的“编辑”,进入编辑页面,然后我们可以在页面上方的“菜单栏”,点击“未设置”,选择“数据源设置”,在弹出的窗口中填写要连接的物联网平台信息。“完成”后,显示订阅成功。
(4)设计可视化界面
现在,就可以根据需求,完成可视化界面的设计和搭建。
首先,在可视化编辑页面中,先在右侧的“属性区”设置画布尺寸、主题和封面。
在组件区找到“装饰组件”中的“文字”进行添加,在组件属性中,修改文本的显示内容,并隐藏底色。
使用上面的方法,添加文本显示“请输入社区空余车位数量并发布:”。
在组件区找到“基础组件”的“输入框”进行添加,然后在组件属性中,找到“Topic”选择siot/空余车位数,勾选“隐藏底色”。
2. 程序运行
点击项目名称下拉菜单中的“保存”,然后“全屏”查看整个可视化界面。
社区工作人员通过在输入框中输入空余车位数量,点击发送按钮,进行空余车位信息发布。发送成功后,可以在物联网平台siot/空余车位数主题中,查看相应的数据。
任务三:搭建移动终端
移动终端主要用于车主接收车位空余信息,并将自己的车牌信息上传到服务器端。因此,移动终端的功能主要分为两个:接收空余车位信息、上传车牌信息。
1. 编写程序
(1)设计UI界面
为了简化程序,这里将界面中的框以及不用变化的文字制作成了一张背景图。首先将这个任务要用的图片,从图片素材库中导入到文件系统。
使用显示图片指令,设置背景图片的显示位置。使用显示文字指令,设置界面中文字的显示位置。使用增加按钮指令,设置一个请求使用的按钮。程序如下:
(2)接收空余车位信息
要接收服务器端发送的空余车位信息,需要用到MQTT-py库的指令。因此添加“MQTT-py”库,点击“扩展”在官方库中找到“MQTT-py”并点击,完成添加。
使用MQTT指令,完成“MQTT的初始化——发起连接——保持连接——订阅”这四个步骤,这里需要订阅的主题为:siot/空余车位数。
使用MQTT接收指令,接收服务器端发送的消息。当接收到服务器端siot/空余车位数主题发送的空余车位消息时,使用更新文本内容参数指令,更新空余车位数据。
(3)上传车牌信息
看到行空板上显示空余车位数量后,车主可以点击请求使用按钮,发送请求使用的消息给服务器端。在当点击回调函数被按下指令下,使用MQTT发布并存数据库指令,向siot/车位信息主题发送自己的车牌号,使用更新文本内容参数指令更新文本提示“发送请求成功!”。完整程序如下:
2. 程序运行
点击运行,程序运行成功后,使用任务二中的可视化界面,发送社区空余车位数量,当移动终端接收到siot/空余车位数主题的消息后,点击请求使用按钮,向siot/车牌信息主题发送车牌号。当然SIoT平台中的“siot/车牌信息”主题中,也会显示接收到的车牌号。
任务四:搭建智能终端
智能终端主要是对进出社区的车辆进行车牌号识别并控制闸机门,当摄像头识别到车牌号是移动终端上传的车牌号时,自动打开闸机门。因此,智能终端的主要功能分为三个:建立车牌号列表、识别车牌号、控制闸机门。
1. 硬件连接
将摄像头连接到行空板的USB端口,将舵机连接到行空板的P23引脚,硬件连接成功后,使用USB线将行空板连接到计算机。
2. 编写程序
(1)建立车牌号列表
因为智能终端和服务器端使用的是同一块行空板,所以在任务二的基础上,继续完善程序。添加“MQTT-py”库,完成“MQTT的初始化——发起连接——保持连接——订阅”这四个步骤。这里订阅的主题为:siot/车牌信息。
新建变量车牌信息,并使用初始化列表指令,将变量车牌信息赋值为列表。
使用MQTT接收指令,接收服务器端的车牌信息。当接收到移动终端siot/车牌信息主题发送的车牌号消息时,使用列表添加指令,将MQTT消息(车牌号)添加在列表末尾。
(2)比对车牌号
打开摄像头,对车牌号进行识别,需要在Python主程序开始下,添加初始化摄像头直到成功指令。在循环执行指令中,添加打开摄像头画面进行读取指令、开始进行车牌识别指令、获取车牌识别结果指令。
使用for循环指令,将车牌信息列表中的车牌号取出来,依次与识别结果的车牌号进行比对。
(3)控制闸机门
添加“舵机”库,点击扩展,在“pinpong库”中找到“舵机”并点击,完成添加。在Python主程序开始下,使用舵机初始化引脚指令,对舵机引脚进行初始化,并使用舵机转动指令,设置舵机的初始角度为10度。
当识别的车牌号是车辆信息列表中的车牌号时,使用舵机转动指令,控制舵机旋转到100度(打开闸机门),然后等待10秒,控制舵机转动到10度(关闭闸机门)。完整程序如下:
3. 程序运行
在移动终端行空板上运行任务三的程序,在智能终端行空板上运行任务四的程序。两块行空板的程序都运行成功后,打开智能终端的可视化界面,输入空余车位数量进行发布。移动终端上接收并显示空余车位数量,按下请求使用按钮后,将车牌号发送给智能终端。
智能终端存储车牌号到车牌信息列表,按下按钮A,当摄像头识别出的车牌号是存储在列表中的车牌号时,就打开闸机门。
知识园地
1. 了解摄像头识别车牌号原理
车牌号识别原理是通过摄像头对车辆进行拍照,然后通过车辆图像进行车牌号识别,识别过程中涉及的步骤有:车辆检测—图像采集—图片预处理—车牌定位—字符分割—字符识别—结果输出。
(1)车辆检测
在拍照之前,要检测车辆是否进入了摄像头的最佳焦距位置。所以,车辆检测就是车牌识别的第一步。摄像头是被动采集数据的,所以它不知道什么时候拍照。
其实,有很多种方法来触发摄像头拍照,比如生活中最常用的是红外法,当车辆进入拍摄区域,红外射线会被车辆遮挡,这个时候摄像头和系统联动,就会拍下车辆的照片。
这课中,我们则使用行空板的硬件触发,当车辆进入拍摄区域时,按下按钮A,这个时候摄像头就会拍下车辆的照片,以供后续车牌识别使用。
(2)图像采集
对进入有效焦距范围的车辆拍摄照片,这一步很容易理解。车牌识别系统的软件端会根据车辆进入的视频来截取图片,或者直接拍摄图片。获取照片后,提供给识别系统备用。
(3)图片预处理
我们都知道车有很多种颜色,颜色一多,计算机就容易眼花缭乱。因此,需要将图片处理为只有黑色和白色,这种图片处理方式就是图片二值化,也称为“熊猫化”!处理过程中,会对图片的每一个像素点进行RGB值判断,根据设定的值(例如160),将大于160的像素点处理成白色,将小于160的像素点处理成黑色。
(4)车牌定位
图片处理完成后,怎样才能对车牌进行定位呢?车牌是规则的长方形,那就需要找到图片中的长方形,然后计算机扫描处理后的图片,由左到右,由上到下,把颜色从黑到白或者由白到黑的像素全部记录下来。然后根据这些像素来计算哪个区域是长方形,并且找到符合车牌的比例的位置进行定位。
如何判断是不是车牌号呢?很简单,对该区域再来一波扫描。因为是处理后的图片,如果有车牌号,那就一定会有黑白变化,尤其是纵向方向。这样就缩小了范围,能够很快找到车牌。
(5)字符分割
成功找到车牌后,根据扫描到的车牌对每一个字符宽度做纵向分割。因为车牌图像已经处理成了黑白两种颜色,所以车牌字符要么是白色字黑底,要么黑色字白底,很容易得到字符的高度和宽度。分割就是以此为依据,把车牌的所有字符都分割成单个字符。
(7)字符识别
将分割好的字符,依次从车牌库模板中进行比对,然后从车牌模板库中找出相似度最高的图片。目的就是获得车牌省别等的汉字,26个英文大写字母,和0-9的10个数字。
(7)结果输出
比对过程中,会将相似度最高的图片模板依次存放到一个数组中,最后通过遍历的方法,获得识别成功的车牌号。
2. 了解AIoT在实际生活中的应用
AIoT, AI和IoT的组合,即人工智能和物联网融合技术。物联网和人工智能之间的融合带来了超强的人机交互、数据管理和分析。AIoT也正以一种全新且迅速的方式,改变着我们的生活。从家庭、教育、城市、安防、农业、医疗、制造到运输,AIoT在每一个领域都有体现。
下面我们来简单了解一下,在生活中最为常见的AIoT应用,智能家居与智慧农业。
智能家居
人们谈论最多的AIoT应用之一,在家庭中的应用,AIoT使家用电器变得更智能化。无论你是想到照明系统还是家庭监控,AIoT真的把家的便利性提升到了一个新的水平。
以家庭照明为例,家庭照明系统与AIoT相结合。你不仅可以通过智能手机打开或关闭家里的灯,还可以通过语音指令控制灯的开启或关闭,甚至还可以通过传感感应外界的环境光,实现不同的灯光亮度及灯光颜色的调节。
智慧农业
传统农业中,都是由人来完成施肥、灌溉、收割等工作。现在有了AIoT技术,这些工作都可以由土地自己“决定”。传感器实时监测土壤及植物生长情况,将信息传输给决策层,AI对数据进行分析后,再来决定进行哪项工作。通过AIoT技术,可以对每一块土地进行个性化管理,甚至对同一区域的不同植物提供不一样的服务,解放我们的双手,还能节约资源、提高产量。
3. 指令学习
挑战自我
为了让移动终端更加人性化,下面大家修改一下智能终端与移动终端的程序,实现在移动终端上显示车辆驶入和驶出的时间。当然你还可以在显示出场时间后,增加一条提示语句“欢迎下次使用,一路平安!”。
提示:需要在SIoT V2.0平台,再新建一个siot/识别时间主题。
附件下载
链接:https://pan.baidu.com/s/1jJOcazyOAIL9L3cKFs70Ng?pwd=7qma
提取码:7qma
太酷了,太酷了! 请问运行安装了1-Install_dependency.py,还是找不到“车牌识别”库怎么办?谢谢!
页:
[1]