项目背景介绍
随着自动驾驶技术的快速发展,人们对于自动驾驶汽车的安全性和智能化水平提出了更高的要求。在自动驾驶系统中,交通信号灯的准确识别是确保车辆遵守交通规则、实现安全行驶的关键环节之一。
本项目将使用行空板与USB摄像头,制作一个信号灯识别系统,利用opencv技术,让机器能够准确识别交通信号灯的颜色。
材料清单
硬件清单:
软件使用:Mind+编程软件 x1
下载地址:https://mindplus.cc/
硬件连接
将USB摄像头连接到行空板上,如下图。硬件连接成功后,使用USB线将行空板连接到计算机。
软件准备
(1)打开Mind+,点击“扩展”,在“官方库”中,选择“行空板”与“Opencv”。
(2)在“用户库”中,点击选择“numpy”、“opencv_maxbot”。
注意:numpy”和“opencv_maxbot”的查找,只需要在检索框中输入下列链接,然后点击完成加载。
numpy : https://gitee.com/kiki12345/maxbot_numpy
opencv_maxbot: https://gitee.com/kiki12345/maxbot_opencv
编写程序
打开摄像头显示实时视频流
首先打开摄像头,将摄像头检测到的画面实时显示在行空板上。
新建一个“带参函数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,是根据图像质量多次测试后得出的一个值。
使用同样的方法,就可以判断摄像头是否检测到绿灯,完整程序如下:
程序运行
点击运行程序,当摄像头检测到红色卡纸时,Mind+终端打印红灯;当摄像头检测到绿色卡纸时,Mind+终端打印绿灯。
知识园地
1. 认识HSV色彩模型
与RGB色彩空间不同的是,HSV 色彩模型更接近于人类对彩色的感知经验,非常直观地表达颜色的色调、鲜艳程度与明暗程度,方便进行颜色的对比。HSV通过三个部分表示彩色图像:
l Hue:色调、色相
l Saturation:饱和度
l 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)时,我们就判断摄像头检测到了绿灯。
fly n2024.11.25
急需
fly n2024.11.25
请问为什么程序编完后不能运行??