大数跨境
0
0

行空板无人驾驶系列课程 第3课:信号灯识别系统

行空板无人驾驶系列课程 第3课:信号灯识别系统 蘑菇云创造
2025-05-15
1
导读:你将:1.认识HSV色彩模型2.了解图像处理的基本原理3.学习通过识别红绿灯卡纸控制小车停止和前进

点击“蘑菇云创造”关注我们


随着自动驾驶技术的快速发展,人们对于自动驾驶汽车的安全性和智能化水平提出了更高的要求。在自动驾驶系统中,交通信号灯的准确识别是确保车辆遵守交通规则、实现安全行驶的关键环节之一。


本项目将使用行空板M10、无人驾驶小车与USB摄像头,开发一套高效可靠的信号灯识别系统,利用先进的视觉技术,让自动驾驶汽车能够准确识别并响应交通信号灯的状态,从而保障行车安全、提升智能驾驶体验。





任务目标

小车在自主巡线过程中,对交通信号灯进行实时识别,并将摄像头中检测到的画面实时显示在行空板上。当小车识别到红灯时,小车停止巡线;识别到绿灯,小车继续巡线。






知识点

  1. 认识HSV色彩模型
  2. 了解图像处理的基本原理
  3. 学习通过识别红绿灯卡纸控制小车停止和前进





材料清单

硬件清单:

软件使用:Mind+编程软件

下载地址:https://mindplus.cc/


  课 前 准 备 



 环境设置

在开始正式学习之前,我们需要对行空板进行一些基础准备,确保系统和环境设置都正确。


具体步骤,请参考:行空板无人驾驶系列课程 第一课 课前准备 部分内容。





动手实践

这个项目是通过计算机视觉技术,实现对路口的信号灯状态进行实时检测与识别。识别到红灯,小车停止;识别到绿灯,小车巡线。因此,项目分为以下两个小任务来实现。

任务一:信号灯检测系统

对摄像头采集到的实时图像进行处理,准确地识别当前信号灯的颜色状态(红灯、绿灯)。

任务二:信号灯识别系统

系统实时反馈检测结果,小车根据检测结果,执行对应的操作。红灯停,绿灯行。




任务一:信号灯检测系统



1.硬件连接

使用type-c转A数据线,将USB音频模块与行空板连接,然后再使用type-c转A线将摄像头连接在音频模块上。


2.软件准备

(1)打开Mind+,点击“扩展”,在“官方库”中,选择“行空板”与“Opencv”。

(2)在“用户库”中,选择“numpy”、“Maxbot行空板小车电机驱动”、“opencv_maxbot”。


3.编写程序

打开摄像头显示实时视频流

首先打开摄像头,将摄像头检测到的画面实时显示在行空板上。详细的操作以及介绍,可查看第2课任务一。


新建一个“带参函数detect_traffic_lights”,参数设置为frame。在显示实时视频流程序下,调用创建好的带参函数。并在“Python主程序开始”下,使用“初始化numpy”指令,初始化numpy库。


图像处理基础操作

摄像头识别红绿灯需要使用OpenCV图像处理技术,主要涉及图像空间转换、颜色提取、形态学去噪和统计颜色像素四个步骤。接下来,将会根据这几个知识点在函数detect_traffic_lights下来完成程序的编写。


注意:关于“图像处理操作”的相关知识,见知识园地。


(1)图像颜色空间转化

图像颜色空间转化的目的是方便提取目标颜色。使用“对象名 将图片转换为 HSV格式”指令,将摄像头采集的图像frame从BGR颜色空间转换为HSV颜色空间。


图像处理中使用HSV颜色空间时,我们还需要指定一个颜色范围来选择我们感兴趣的颜色。例如,这个项目中,主要是识别红色和绿色。因此,新建“变量red_lower变量red_upper变量green_lower变量green_upper”,用来定义红色与绿色的HSV上限和下限。


如何确定红色和绿色的颜色范围?在HSV颜色空间下,红色的色相(H)范围为0-10度,饱和度(S)为120-255,亮度(V)为70-255,此范围通常可涵盖大多数红色。因此,使用“创建Numpy数组”指令,设置变量red_lower的值为[0,120,70];设置变量red_upper的值为[10,255,255]。


注意:色调的取值范围为0-360度,饱和度的取值范围为0-255,亮度的取值范围为0-255,详细介绍见知识园地。


在HSV颜色空间下,绿色色相(H)的范围为:50-80度;饱和度(S)的范围为:50-255;亮度(V)的范围为:50-255。在这个范围下,通常能够涵盖大多数绿色。


(2)颜色提取

接下来,会根据创建好的红色范围和绿色范围,对摄像头转化后的HSV图像颜色提取。使用“提取图片 的范围内像素 范围下限 范围上限”指令,根据变量red_lower、变量red_upper和变量green_lower、变量green_upper,提取出对应的红色和绿色的像素并创建掩膜进行二值化处理。


新建“变量red_mask变量green_mask”,将进行二值化处理后的图像赋值给变量red_mask、变量green_mask。


(3)形态学去噪

去噪的目的是使图像更清晰,便于后续分析和处理,从而提高图像特征识别的准确性。使用“对象名 对二值化图像 进行形态学去噪处理”指令,去除图像中的噪点。


(4)统计颜色像素

对图像进行基础处理后,新建“变量red_pixels变量green_pixels”,使用“计算数组 中非零元素数目”指令,计算红色区域和绿色区域的像素数量,并赋值给对应的变量red_pixels与变量green_pixels。


最后,使用“如果……那么执行”指令,根据红色像素和绿色像素的数量来确定红绿灯状态。只有当变量red_pixels>变量green_pixels,且变量red_pixels>2000时,检测到红灯。其中,阈值2000,是根据图像质量多次测试后得出的一个值。


使用同样的方法,就可以判断摄像头是否检测到绿灯,完整程序如下:


4.程序运行

远程连接192.168.1.80,连接成功后,点击运行。当摄像头检测到红色卡纸时,Mind+终端打印红灯;当摄像头检测到绿色卡纸时,Mind+终端打印绿灯。




任务二:信号灯识别系统



1.硬件连接

这个巡线传感器是由3个独立的巡线传感器组合在一起,因此,每个巡线传感器是独立工作的。下面,将这三个巡线传感器分别连接P10、P11、P13这三个引脚。左侧巡线传感器—P10、中间巡线传感器—P11、右侧巡线传感器—P13。


2.软件准备

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


3.编写程序

信号灯检测和自动巡线是两个独立的功能,需通过多线程实现同时运行。使用“线程对象thread启动”指令与“当线程对象thread1启动后执行”指令,在“Python主程序开始”下,启动线程。


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


新建“变量stop”,在“Python主程序开始”指令下,使用“将变量stop赋值为”指令,初始化变量stop的值为0。在“函数detect_traffic_lights”指令下,使用“全局global”指令,将变量stop设置为全局变量。当检测到红灯时,使用“将变量stop赋值为”指令,将变量stop的值设置为1;当检测到绿灯时,将变量stop的值设置为0。


注意:这个初始化变量stop指令,需要放在线程启动指令之前。


最后,在线程的“循环执行”指令中,使用“如果……那么执行”指令,对变量stop的值进行判断。当变量stop=1时,识别到红灯,小车停止;当变量stop=0时,识别到绿灯,小车巡线。完整程序如下:


4.程序运行

将小车放在地图上,然后打开小车电源,等行空板初始化成功后。远程连接192.168.1.80,连接成功后,点击运行,小车将沿着地图上的黑线行驶。当摄像头检测到红灯时,小车停止;当红灯切换为绿灯后,小车继续巡线。





知识园地

1. 认识HSV色彩模型

与RGB色彩空间不同的是,HSV 色彩模型更接近于人类对彩色的感知经验,非常直观地表达颜色的色调、鲜艳程度与明暗程度,方便进行颜色的对比。HSV通过三个部分表示彩色图像:

  • Hue:色调、色相

  • Saturation:饱和度

  • Value:明度


色调(H):色调是色彩的基本属性,就是平常说的颜色的名称,如“赤橙黄绿青蓝紫”等。色调与混合光谱中的主要波长相关,从波长的角度考虑,不同波长的光变现为不同的颜色,实际上体现的是色调的差异。色调的取值范围为0-360度,对应颜色如下表:

其中,两个角度之间的角度对应两种颜色之间的过渡色。(之所以称之为角度,是因为H的取值范围是0-360。)


饱和度(S):饱和度指色彩的纯度,通俗地说就是颜色的深浅。饱和度越高色彩越纯,饱和度越低则逐渐变灰。饱和度与所加白光的数量成反比。饱和度的取值区间是[0,1]。灰度颜色的饱和度值是0。如果颜色的饱和度很低,那么它计算所得的色调不可靠。在OpenCV内,饱和度要映射到[0,255]范围内。

亮度(V): 表示人眼感知的光的明暗程度。如果其中掺入的白色越多,则亮度越高;如果在其中掺入的黑色越多,则亮度越低。亮度的取值区间是[0,1],当亮度值是0时,图像是纯黑色。在OpenCV内,亮度也要映射到[0,255]范围内。


2.了解图像处理的基本操作

使用opencv识别红绿灯将涉及读入视频流、捕获视频帧、图像处理、颜色检测、识别结果这五个步骤,这里重点介绍一下在图像处理中的基本操作:图像颜色空间转换、颜色提取、形态学去噪、统计颜色像素。


图像颜色空间转换

如何才能进行图像的颜色空间转化呢?下面以绿灯卡纸为例,进行图像处理分析。使用“对象名 将图像 转化为HSV格式”指令,将从摄像头中捕获的BGR图像,转化为HSV格式的图像。


颜色提取

在颜色提取过程中,设定要提取的绿色HSV范围值(这个范围值通常是目标颜色在HSV空间中的最大值和最小值)。然后使用“提取图像 的范围内像素 范围下限 范围上限”指令,创建一个掩膜,这个掩膜的作用是指定颜色范围内(绿色)的像素设置为白色,其余的像素设置为黑色。


形态学去噪

形态学去噪在图像处理中扮演着重要的角色,主要目的是消除图像中的噪声(噪声是指图像中白色的点和边缘的不规则),让图像变得更加清晰、易于处理,提高检测的准确性。使用“对象名 对二值化图像 进行形态学去噪处理”指令,进行形态学去噪,去噪后的图像如下:


统计颜色像素

图像处理完成后,使用“计算数组 中非零元素数目”指令,统计图像中非零(即白色)像素的数量。最后,当目标颜色(白色)像素个数大于阈值(2000)时,我们就判断摄像头检测到了绿灯。


3.指令学习

这条指令用于导入名为numpy的Python库。

这条指令主要是用于创建一个包含三个元素的numpy数组。

这条指令是将图像从BGR(蓝绿红)颜色空间转换为HSV(色相、饱和度、明度)颜色空间。

这条指令用于创建一个掩膜(mask),将在指定颜色范围内的像素置为白色(255),而其他像素置为黑色(0)。

blue_lower 和 blue_upper 是定义的目标颜色范围,它们以numpy数组的形式表示。

这条指令主要作用是消除小的噪声或细小的物体,同时保持大物体的结构特征。

这条指令主要是统计图像中非零(即白色)像素的数量。





挑战自我

在生活中,我们遇到红灯踩刹车停车时,车灯会保持亮着,这是为了提醒其他驾驶员和行人,我们的车辆已停下。接下来,大家尝试一下修改程序,实现当小车识别到红灯时,小车停止车灯亮;当小车识别到绿灯时,小车巡线车灯灭。


获取课程资源,添加小助手微信:DFRobot2018







往期推荐

“轻装”上阵,“无线”可能——行空板M10扩展组合应用创作赛!

行空板无人驾驶系列课程 第1课:自动驾驶车道保持系统

行空板无人驾驶系列课程 第二课:行人避让系统

给梦想插上科技的翅膀 第八届全国青少年人工智能创新挑战赛启动

【义务教育信息科技课程教学指南】六年级 过程与控制——第26课 倒车防撞请注意

【声明】内容源于网络
0
0
蘑菇云创造
蘑菇云是DFRobot旗下专注于AI人工智能、创客、STEAM、劳动教育的科技创新教育品牌;以为中国培养下一代科技创新人才为使命,为学校提供k12全龄段科技创新教育解决方案。
内容 969
粉丝 0
蘑菇云创造 蘑菇云是DFRobot旗下专注于AI人工智能、创客、STEAM、劳动教育的科技创新教育品牌;以为中国培养下一代科技创新人才为使命,为学校提供k12全龄段科技创新教育解决方案。
总阅读2.0k
粉丝0
内容969