行人避让系统能够实时监测道路上的行人,并在需要时自动控制车辆停止,避让行人。通过车辆和行人的协调与合作,不仅可以提升城市交通的安全性,还有助于塑造更加友好的城市交通文化,为城市居民创造更加安全和便利的出行环境。
接下来,就使用行空板无人驾驶小车和摄像头,制作一款这样的行人避让系统吧!

任务目标
行空板无人驾驶小车在自动巡线过程中,监测到道路上有行人,小车就自动停止;监测到行人离开后,小车自动巡线。

知识点
1. 认识RGB与BGR色彩模型
2. 了解haar cascade算法
3. 掌握opencv库的使用方法
4. 掌握矩形框框选人脸的方法
材料清单
硬件清单:

软件使用:Mind+编程软件 x1
下载地址:https://mindplus.cc/

课 前 准 备 ——环境设置
在开始正式学习之前,我们需要对行空板进行一些基础准备,确保系统和环境设置都正确。
具体步骤,请参考:行空板无人驾驶系列课程 第一课 课前准备 部分内容。
动手实践
这个项目,主要是学会如何使用摄像头,并判断摄像头中是否检测到了人脸,检测到人脸后,怎样控制正在巡线的小车停止。因此,项目分为以下三个小任务来实现。
任务一:显示实时视频流
将摄像头拍摄到的视频画面,实时显示在行空板的屏幕上。
任务二:行人检测系统
当画面中出现人脸时,用绿色矩形框将人脸框选出来,矩形框的位置随人脸移动,矩形框的大小也会随人脸大小改变。
任务三:行人避让系统
小车保持自动巡线,在巡线过程中,检测到人脸后,小车停止巡线,避让行人。当行人离开后,小车继续巡线。
任务一:显示实时视频流
1. 硬件连接
使用摄像头时,有以下两种连接方法。
方法一:
当我们只使用摄像头时,可以直接使用type-c转A数据线,将摄像头与行空板连接。

方法二:
通过USB音频模块进行转换连接,使用type-c转A数据线,将USB音频模块与行空板连接,然后再使用type-c转A线将摄像头连接在音频模块上。使用这种转换连接方式有个优点,可以同时使用这两个模块。

2.软件准备
(1)打开Mind+:按照下面的图示完成软件准备工作。

(2)添加OpenCV库:点击“扩展”,在“官方库”中,选择“OpenCV”。
(3)添加opencv_maxbot库:点击“扩展”,在“用户库”中,选择“opencv_maxbot”。

3. 编写程序
首先,使用opencv_maxbot指令区的“对象名cap初始化0号摄像头并设置帧缓冲”指令,在“Python主程序开始”下,创建一个视频捕获对象“cap”,并初始化从第一个摄像头(0号摄像头)捕获到的视频。

使用“创建窗口winname并设置为全屏”指令,在屏幕上创建一个名为winname的窗口,并将窗口设置为全屏模式,以便将摄像头中的视频流全屏显示在行空板屏幕上。

接下来,在OpenCV指令区中,使用“从VideoCapture对象vd中抓取下一帧grab以及状态ret”指令,从捕获的视频流中抓取一帧图像。

抓取图片后,需要使用“如果……那么执行”指令与“逻辑运算符 =”指令,判断状态ret的值是否True(判断读取帧是否成功)。

判断条件为真时,说明成功读取了帧,使用“显示图片img并设置图片名称“Mind+.png””指令,将抓取的图像显示在创建的行空板窗口中。

最后,使用“每1毫秒刷新图像”指令,不断地刷新图像,将摄像头中的视频流显示在行空板上。

4. 程序运行
远程连接192.168.1.80,连接成功后,点击运行。行空板的显示窗口中,实时显示摄像头捕获到的视频流。

任务二:行人检测系统
1. 编写程序
要判断是否检测到行人,需要用到OpenCV库中的级联分类器与人脸数据模型。新建一个“变量face_detector”,并在“Python主程序开始”下,使用OpenCV指令区中的对象检测“创建级联分类器casecade”指令,创建一个名为face_detector的级联分类器。这个项目的程序,在任务一程序的基础上进行添加即可。

级联分类器创建好后,使用“级联分类器加载文件(人脸数据模型)”指令,为该分类器加载训练好的人脸检测模型。

人脸检测模型加载成功后,在“如果……那么执行”指令中,使用“将图片img使用将Alpha通道添加到BGR进行转换成outImg”指令,将获取成功的一帧彩色图像转换为灰色图像。

使用“返回级联分类器model_name检测到的对象 输入图像img_name缩放比例1.1相邻个数5最小检测大小(30,30)”指令,对灰色图像进行人脸检测。这个指令的返回值是一个列表[[x,y,w,h]],x、y是人脸的坐标,w是人脸宽,h是人脸高。因此,新建一个“变量faces”,用来保存该指令的返回值。

当图像中出现人脸时,变量faces中会存入一个人脸列表[[x,y,w,h]]。因此,只用判断列表faces的长度是否大于0就可以了。

新建一个“变量face”,使用“列表 索引0的值”指令,将列表faces中的人脸坐标索引出来并赋值给变量face。这样变量face里面保存的就是[x,y,w,h],变量face也是一个列表。

要使用矩形框将人脸框选出来,就需要将列表face中的值全部索引出来。分别新建“变量x”、“变量y”、“变量w”、“变量h”,然后使用“列表 索引0的值”指令,分别索引出人脸坐标值,并赋值给对应的变量。

人脸检测的坐标索引成功后,使用“在图片 上绘制一个首部定点(x,y)尾部定点(x,y)颜色 粗细0线性填充线的矩形”指令,在检测到的人脸上绘制一个矩形框。完整程序如下:

2. 程序运行
远程连接192.168.1.80,连接成功后,点击运行。行空板的显示窗口中,实时显示摄像头捕获到的视频流。当视频流中检测到人脸时,会有一个绿色矩形框将检测到的人脸框选出来。

任务三:行人避让系统
开始编写程序之前,先来分析一下行人避让系统这个任务,需要实现哪些功能。首先,小车要能够自动巡线,并且摄像头也要实时检测行人。因此,自动巡线和行人检测是两个独立的功能。当摄像头检测到行人时,小车停止巡线;行人离开后,小车继续巡线。因此,自动巡线和行人检测这两个功能又相互联系。
1. 硬件连接
这个巡线传感器是由3个独立的巡线传感器组合在一起,因此,每个巡线传感器是独立工作的。下面,使用白色硅胶线将这三个巡线传感器分别连接P10、P11、P13这三个引脚。左侧巡线传感器—P10、中间巡线传感器—P11、右侧巡线传感器—P13。

2. 软件准备
这个任务,在任务二程序的基础上进行添加即可。点击“扩展”,在“pinpong库”中,找到“pinpong初始化”并完成添加。

3. 编写程序
由于,行人检测和自动巡线是两个独立的功能,也就是这两个功能要同时执行。使用“线程对象thread1启动”指令与“当线程对象thread1启动后执行”指令,在“Python主程序开始”下,启动线程。

在“当线程对象thread1启动后执行”指令下,添加“循环执行”指令,并在指令中完成小车自动巡线功能。当然,还需要在“Python主程序开始”指令下,使用“pin初始化 引脚号 模式”指令,对巡线传感器引脚进行初始化。第1课中,学习过了小车自动巡线功能,这里不作详细讲解。

新建“变量stop”,在“Python主程序开始”指令下,使用“将变量stop赋值为”指令,初始化变量stop的值为0。当检测到人脸时,使用“将变量stop赋值为”指令,将变量stop的值设置为1。
注意:这个初始化变量stop指令,需要放在线程启动指令之前。

在“当线程对象thread1启动后执行”指令下,使用“全局global”指令,将变量stop设置为全局变量。最后,在线程的“循环执行”指令中,使用“如果……那么执行”指令,对变量stop的值进行判断(stop=1 ?)。条件为真时,使用“电机停止”指令,设置两个电机都停止。

当行人离开后,小车继续巡线。使用“等待1秒”指令,设置小车停止3秒后,使用“将变量stop赋值为”指令,设置变量stop的值为0。完整程序如下:

4. 程序运行
将小车放在地图上,然后打开小车电源,等行空板初始化成功后。远程连接192.168.1.80,连接成功后,点击运行,小车将沿着地图上的黑线行驶。当摄像头检测到有行人时,小车停止;当行人离开后,小车继续巡线。
注意:为了方便展示,将卡纸夹放到黑色轨迹上,当然你也可以将卡纸夹放到黑色轨迹外。

知识园地
1. 认识RGB与BGR色彩模型
自然界中常见的大部分颜色都可以通过将三基色按照一定比例混合得到。而在RGB色彩空间中,存在R(red)、G(green)、B(blue)三个通道。每个色彩通道值的范围都在[0,255]之间,我们用这三个色彩通道的组合表示颜色。下图表示不同RGB对应的颜色:

三个通道值均为0时表示黑色,均为255时表示白色。RGB色彩空间共可表示256×256×256(即16,777,216)种颜色。RGB颜色空间基于颜色的加法混色原理,从黑色不断叠加Red,Green,Blue的颜色,最终可以得到白色。

RGB与BGR色彩模型有什么区别呢?其实两者在信息量上没有任何区别,只是通道顺序不一样。RGB色彩空间的通道顺序是R-G-B,opencv读取图像时默认通道顺序是B-G-R。
2. 了解haar cascade算法
haar cascade算法,又称haar级联算法,它是如何工作的呢?下面,借助一张流程图来帮助我们了解harr级联算法的工作流程。

获取原始图像
获取原始图像,使用“从VideoCapture图像vd中抓取一帧grab以及状态ret”指令,从摄像头图像中抓取一帧原始图像。

转换灰度图
将获取的原图图像,通过“将图片使用BGR和灰度之间转换进行转换成”指令,将彩色图像转换为灰度图像。

haar特征提取
Haar特征提取是通过将黑白矩形模板与图像局部区域进行比对,检测是否符合预设的灰度分布特征。

第一幅人脸检测图中,表明眼睛区域比眼睛下面的脸颊颜色深;第二幅人脸检测图中,表明了左右眼区域比鼻梁区域颜色深。以这种方式,进行整个图像的特征提取,如果提取的特征符合人脸数据模型,那说明人脸特征提取成功。
注意:人脸数据模型,是提前训练好的,这里不做详细介绍。
识别信息
识别信息,使用“返回级联分类器model_name检测到的对象 输入图像img_name缩放比例1.1相邻个数5最小检测大小(30,30)”指令,就可以得到检测到的人脸识别信息。下面重点介绍一下缩放比例、相邻个数以及检测大小。

(1)缩放比例
缩放比例是人脸检测中一个重要的参数,用于控制图像金字塔的缩放比例。例如,现在缩放比例为1.3,表示在图像金字塔中,每两层图像之间的尺度变化大约是1.3倍。如果将原始图像大小视为1.0,那么在下一层金字塔中,图像的大小将增加到1.3倍,然后在下一层金字塔中再次增加到1.3倍,以此类推。

金字塔的层数通常取决于人脸检测器的具体设置和输入图像的尺寸。如果输入图像的原始尺寸较大,金字塔可能要包含更多的层级,输入图像较小,层级就越少。缩放比例取决于应用的需求和性能要求,通常情况下,可以根据实验和性能优化来选择适当的缩放比例,以获取最佳的人脸检测效果。我们测出将缩放比例设置为1.3时,是最佳的人脸检测效果。
(2)相邻个数
相邻个数适用于过滤掉一些虚假检测的参数,主要是控制在检测到的人脸周围可以有多少个相邻的矩形边界框,才能将这个检测结果保留为有效的人脸检测。例如,程序中设置相邻个数为5,如果一个矩形边界框周围的相邻矩形边界框数量不足5个时,那就认为是虚假检测。相邻矩形边界框数量大于等于5个时,就认为是有效检测。
注意:关于相邻个数,你也可以根据实验结果来选择合适的参数。

(3)最小检测大小
最小检测大小,用于指定算法应该考虑的最小人脸尺寸。例如:设置的尺寸为{30,30},说明检测过程中检测到了人脸的宽度或高度小于30个像素时,就忽略检测结果。

绘制结果
在识别信息中,检测到人脸后,就会返回检测到的人脸信息[[x,y,w,h]]。返回的人脸信息,使用“在图片 上绘制一个首部定点(x,y)尾部定点(x,y)颜色 粗细0线性填充线的矩形”指令,就可以使用矩形框将原始图像的人脸框选出来。

3. 指令学习

挑战自我
在任务二中,检测到了人脸,就会使用矩形框将人脸框选出来。下面,大家尝试一下,在框选的人脸框上添加一个“Ped,stop”的字样,并显示在行空板上。

提示:使用“在图片 上绘制文字 位置 大小 颜色”指令。

评论