基于Python的高速公路车道线的检测与识别
2023-04-07黄晓青康建强
黄晓青,康建强
(宁夏师范学院 物理与电子信息工程学院,宁夏 固原 756099)
随着科学技术的发展,人们对高品质生活的追求日益强烈,无人化和智能化在未来的生活中越来越普遍.而无人驾驶领域属于现代科技中较火热并且是最具有发展的领域之一.目前虽说无人驾驶已进入商业化阶段,但距离正式大规模普及使用还有相当长的一段时间.在无人驾驶中车道线的检测与识别是比较关键的技术.对于车道线的检测与识别方面相关的研究内容有很多,研究时间也较长,在实际应用上却发展较慢,出现这种状况的原因有图像品质问题:车载摄像机获取的图像由于障碍物遮挡、光线阴影和行驶过程中产生的亮度变化等原因使图像有着巨大差异;道路场景受气候因素影响很大:雨雪天气、大雾天气、黄昏和夜晚等给图像识别与处理带来了很大的难度;车道线存在磨损情况:有的路段车道线磨损较严重,被地面污迹掩盖难以区分.这些复杂多变的场景对基于视觉信息进行处理的算法产生了极大的挑战,车道线的识别还存在巨大的提升空间.
使用Python-opencv对车辆采集到的车载视频图像进行处理,从而来识别车道线的方法是一种不错的选择.Python语言有着非常强大的第三方库,在人工智能领域有着极大的优势[1],而人工智能在无人驾驶中起着极为重要的作用,以Python语言完成车道线检测可以很好地与其他无人驾驶技术结合在一起.Pythoncopencv有很多的图像处理算法[2],能够很好地实现车道线的检测与识别的功能.
高速公路车道线的检测与识别通过行车记录仪获取道路图像进行车道线检测识别.首先对视频帧图像实施预处理,包括将图像转化为灰度图和图像去噪.将图像转化为灰度图是为了减小不必要的计算量,同时也为下一步的处理做铺垫;图像去噪采用的是高斯滤波器,能够去除噪声点的同时减少下一步边缘检测时不必要的干扰.然后对图像进行边缘检测提取出车道线的轮廓.为排除大部分不相干元素,可根据车道线在图像中的大致位置,划定感兴趣区域.最后采用Hough变换将边缘检测得到的车道线轮廓点变成线,利用左右车道线的斜率特征划分左右车道,通过迭代求取准车道线斜率与平均斜率的离散值,剔除不符合要求的准车道线,再对符合要求的左右准车道线的首尾端点做多项式拟合,得到最终车道线并进行标记.
1 图像预处理
高速公路车道线的检测中为减少不必要的运算,保留需要的梯度特征,需要对获得的彩色图像进行预处理[3].预处理包括图像灰度变换、高斯滤波和边缘检测.根据人眼对不同颜色的敏感度不同,可通过对彩色图像R、G、B分配不同的权值系数进行加权操作,具体计算过程如公式(1)所示[4],以此来合成所需的灰度图像.
Gray(i,j)=0.299×R(i,j)+0.578×G(i,j)+0.114×B(i,j).
(1)
1474142033204733553374203320414741(a)高斯滤波器模板(b)高斯滤波器三维模型
图像的去噪过程主要采用了如图1(a)所示的高斯滤波器[5],三维模型如图1(b)所示,该高斯滤波器的模糊核尺寸为5.假设该高斯滤波器矩阵为G,图片为K,新图片K′由公式(2)计算可得.
(2)
Canny算子是一种多功能复合型的边缘检测算子,具有定位精度高、容噪性好和获取边缘信息完整度较高的优点[6].Canny边缘检测采用双阈值来确定真实和潜在的边缘.即设置max、min两个梯度阈值,当检测到的梯度值大于给定的max阈值时,将其判定为边界.在检测到的梯度值小于给定的min阈值时,则舍弃,不将其视为边界.对于处在max、min两个阈值中间部分的梯度值,则进行判断,若周围的点是边界点时,保留该点,反之则舍弃.通过这种处理方法,可以排除部分干扰,并将缺失部分连接,不容易被噪声“填充”,稳定性更高.
2 Hough变换检测车道线
高速公路车道线的检测采用Hough变换可将车道线看作直线进行检测.图2(a)表示图像空间,图2(b)和图2(c)表示Hough空间.据图2(a)和图2(b)可知,在图像空间中的一个点可以与Hough空间中的一条直线相对应,图像空间中任意的两个点(x1≠x2)可以对应Hough空间的两条相交的直线,且Hough空间中交点对应的线一定经过图像空间中的这两个点.如果在图像空间中的两个点x1=x2,则其形成的直线斜率无限大,无法用图2(b)的直角坐标来表示,可以采用图2(c)的极坐标表示方式.
如图3(b)所示,Hough空间中有多条线相交于一点,则在图3(a)的图像空间中对应的那些点应位于同一条线上.
图2 Hough变换坐标系对应关系
图3 Hough变换对应关系
3 车道线拟合与标记
图像经过Hough变换,可以得到属于同一直线段的首尾坐标点的集合.根据直线段的首尾坐标点计算直线斜率,剔除斜率不合格的直线段的坐标点.对符合斜率要求的坐标以斜率的正负来区分左右车道线,再将区分后的坐标分别存储.为提高车道线检测的准确度,对分类存储的直线斜率求均值,将斜率与均值差距较大的直线剔除掉,以此得到车道线坐标.
对左右准车道线首尾坐标点集分别用最小二乘法进行拟合获得直线表达式[7].拟合方程为
(3)
由式(3)拟合车道线的直线表达式后,根据车道线所在范围计算车道线在图中的两个端点坐标.在黑底模板上由端点坐标绘制车道线标记,最后将模板图片与原图叠加融合完成车道线的标记.
4 高速公路车道线的检测程序设计
高速公路车道线的检测主要在cv2和numpy这两个Python库的支持下实现,采用Python语言通过pycharm软件进行编程,主要由图像预处理部分、Canny边缘检测部分、Hough变换检测直线部分和车道线的拟合标记部分组成.
高速公路车道线的检测程序流程图如图4所示.首先顺序读取车载视频的一帧图像,进入预处理部分.在预处理部分对读取的单帧彩色图像由彩色图像转化为灰度图像;再用高斯滤波器去除噪声,减少干扰;最后利用Canny算子对图像进行边缘检测获得只保留边缘线条的二值图像.
对Canny算子边缘检测后形成的二值图像进行Hough变换前需要对图中车道线的所在范围划定感兴趣区域,去除非感兴趣区域后进行Hough变换,以此得到二值图像中的直线段首尾坐标集合.对获得的直线段首尾坐标判断是否符合车道线标准,剔除不符合标准的坐标,划分左右车道线点集.再对点集进行拟合,得到车道线方程.最后根据车道线方程画出车道线模板,将车道线模板与原图相加,完成标记并输出.完成一幅帧图像的处理后判断视频图像是否结束,如果未结束则读取下一帧图像继续进行上述处理过程,直至最后一帧图像处理结束.
图4 车道线检测程序流程图
5 车道线检测结果及分析
高速公路车道线的检测采用的车载视频图像为银川南-银川北高速路段.
在对车道线进行检测之前,首先要对车载视频图像进行预处理.采用cv2.cvtColor(参数1,参数2)函数进行处理,R分量权重设置为0.299、G分量权重设置为0.578、B分量权重设置为0.114.图像去噪采用高斯滤波器,高斯模糊核尺寸为5,通过cv2.GaussianBlur函数实现;利用cv2.Canny函数完成图像边缘检测,高、低阈值分别设置为150和50.
图5 车载图像预处理与边缘检测图像
图5(b)为高斯平滑前的灰度图像,对该图像进行高斯平滑处理,得到的结果如图5(c)所示.平滑前灰度值图像和平滑后灰度值图像进行对比,可以从图5(c)中看出锐度明显降低,很好地排除了噪声点造成干扰,而梯度信息依然得到了很好的保留,车道线与周围环境的梯度差异依旧明显.
对高斯滤波图像进行边缘检测,得到的结果如图5(d)所示,其中边缘轮廓信息检测比较准确清晰,边缘信息得到了很好的保留,同时车道线轮廓很清晰.
对图像进行预处理后,为排除不必要的干扰,对车道线在图中的大致范围执行感兴趣区域划定操作.经过大量实验证明感兴趣区域四角坐标设定为(200,440)、(500,280)、(610,280)、(910,440)其效果较好.然后采用Hough变换检测直线部分,可以准确检测出行车道两边的车道线.采用此方法能够极大地提高车道线识别准确度的同时也减少了Hough变换的运算量,提升了运行速度.Hough变换设置rho步长为1,极角分辨率取1弧度,所取直线内相邻两点间距离不超过20像素,该直线至少由15个点组成、长度至少为40像素.对得到的准车道线坐标筛选之后,采用最小二乘法对车道线进行拟合,将拟合好的车道线绘制在黑色背景图像中,即得到黑色蒙版图像,最后将该蒙版图像与原图像相加完成车道线的检测与标记.
图6 车道线检测图
图6(a)为对边缘检测图像进行划定感兴趣的区域,然后对该图进行拟合操作.得到的结果如图6(b)所示,将图6(a)与图6(b)进行比较,可以看出车道线的角度、位置都比较准确,达到了预期的效果.
将图6(b)蒙版图像与图6(c)原图执行加法运算,得到的结果如图6(d)所示,识别生成的车道线与实际车道线的重合度很高,准确地对车道线进行了检测和识别.
为了进一步说明本文检测方法的有效性和准确性,采用同组40min车载视频共1200帧图像分别用本文检测方法、基于Canny算子边缘检测方法和基于均值漂移的图像分割检测方法[8]进行对比,其结果如表1所示.
表1 车载视频图像车道线检测结果
由表1可知,对于同组视频图像,基于Canny算子边缘检测算法没有对图像感兴趣区域划定和对直线进行检测、判断和拟合,不能够很好地将周围复杂环境中干扰信号剔除,导致检测识别率较低.本文采用Hough变换检测直线的同时,经过迭代计算并进行直线判断和拟合,能够达到较高的检测识别率.
6 结论
本文采用了Python语言设计了一种利用车载图像对高速公路车道线进行识别检测方法,具体功能在cv2和numpy第三方库的支持下完成.首先是对视频帧图像实施预处理,包括将图像转化为灰度图和图像去噪.将图像转化为灰度图是为了减小不必要的计算量,同时也为下一步的处理做铺垫;图像去噪采用的是高斯滤波器,能够去除噪声点的同时减少下一步边缘检测时不必要的干扰.然后对图像进行边缘检测提取出车道线的轮廓,为排除大部分不相干元素,可根据车道线在图像中的大致位置,划定感兴趣区域.最后采用Hough变换将边缘检测得到的车道线轮廓点变成线,利用左右车道线的斜率特征划分左右车道,通过迭代求取准车道线斜率与平均斜率的离散值,剔除不符合要求的准车道线,再对符合要求的左右准车道线的首尾端点做多项式拟合,得到最终车道线并进行标记.通过实验该检测方法准确度良好,拟合程度高,预期效果非常好.