姚晓同 杨 晓
(武汉工程大学机电工程学院 武汉430205)
车道线是道路交通标线和标识的重要组成部分,通过线条、箭头、文字等向交通参与者传递引导、限制、警告灯交通信息,以保证车辆行人的生命安全。由于其主要划设于道路表面,经受日晒雨淋,风雨冰冻及车辆的冲击磨耗,故很容易出现破损甚至缺失的情况[1]。传统的车道线破损主要依靠人工目视检测,耗费时间且人工成本巨大,在图像处理技术迅速发展的今天,传统检测方式显然不合适。因此,本文针对实际交通环境,将数字图像处理技术应用到车道线破损检测中,利用车载相机拍摄到的道路图片,提出一种基于透视变换的检测方法,经过对实际道路的实验测试,检测效果良好并且准确度高。
车载相机采集到的图像中除了含有需要的车道线信息外,通常还有许多噪声和干扰信息。对图像进行相关的预处理就是为了强化车道线信息,除去相应的干扰与噪声,为进一步的识别做准备。
目前车载相机采集的图像均为彩色图像,为利于后期处理,同时为了加快处理速度,通常需要把彩色图像转换成灰度图像[2]。
由于本文要识别的对象为白色车道线,背景为灰色混凝土路面或黑色沥青路面,故采用加权灰度化方式,如式(1)所示:
式中:Vgray表示灰度化后的像素灰度值;R、G、B分别为红、绿、蓝三个彩色模型分量,三者权重分别为0.30、0.59、0.11。
图像的滤波处理主要是在尽量保留图像特征的条件下对目标图像的噪声进行抑制,是预处理中不可缺少的操作[3]。由于本文针对对象,即道路路面的背景色相对单纯,但混凝土或沥青路面细小裂缝及坑洼较多,故采用二维零均值离散高斯函数作平滑滤波器。二维高斯函数如下:
该方法是用一个卷积模板对整幅图像像素进行扫描,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值[4~5]。图1为道路图像原始图和经过灰度化及高斯滤波处理之后的图像。
经过对道路图像进行分析,按照本文所需图像特征的重要程度,将图像划分为四个区域,如图1(b)所示。D1基本为天空和无车道线区,D2为车道线左区,D3为车道线右区,K1为ROI区域。故可将K1区域单独提取出来,并通过OpenCV的onMouse函数将K1区域的四个顶角坐标值传输出来,以减少后期工作量[6]。
图1 道路原始图与灰度化ROI划分图
很明显,车载摄像头和目标物有一个倾斜角,故其采集到的图像会有一个透视畸变[7],而为了准确检测车道线破损程度,需要的是ROI鸟瞰图,则需要对图像进行反透视变换。
透视变换(Perspective Transformation)的本质是将图像投影到一个新的视平面,其通用变换公式为
式 中:(u,v)为 原 始 图 像 像 素 坐 标;(x=x'/w',y=y'/w')为变换后的图像像素坐标[8]。透视变换矩阵如下:表示图像线性变换;表
式中示图像平移;T3=[a31a32]用于产生图像透视变换,a33一般为1。所以,给定透视变换对应的四对像素点坐标即可求得透视变换矩阵,完成图像透视变换[9~10]。如图2所示。
图2 透视变换示意图
上一步中本文已提取了目标ROI的四顶角坐标值,将坐标值传输至OpenCV中的warpPerspec⁃tive函数,求得采集图像的透视变换矩阵,从而得到车道线图像的鸟瞰图,同时进行ROI提取,结果如图3所示。
图3 反透视变换后图像鸟瞰图
传统的图像面积提取是先对目标图像进行边缘检测,绘制轮廓线,然后求封闭图形面积[11]。但是,如图3居中位置车道线所示,当车道线边缘出现破损,白色线成为独立区域时,Canny函数无法识别已经破损了的边缘,故无法计算完整车道线总面积,从而大大降低了破损率的准确性。为解决此问题,本文使用返回ROI区域坐标点值的Rect函数来计算车道线面积。
采集图像在进行反透视变换之后,需要对感兴趣区域进行再次提取,将目标区域待检测的破损车道线单独提取出来。由于视角原因,原图像中的车道线为梯形,而此时待处理的车道线图像为鸟瞰实际图像,故可使用Rect函数返回对角坐标值,以获得待测区域矩形参数,从而精确计算车道线总面积A[12~13],如图4所示。
图4 待测车道线坐标示意图
其中A1(x1,y1),A4(x4,y4),故总面积:
为了准确计算残余车道线部分的面积,需要对图像进行分割处理,即利用图像中背景之间的灰度差异,提取本文所需要的像素[14]。本文采用固定阈值操作对ROI区域进行二值化处理,可将车道线部分与路面背景部分明显区分开来,结果如图5所示。
图5 二值化处理结果
本文使用OpenCV的Canny函数进行图像的边缘检测操作,使用findContours函数从二值图像中查找轮廓。经过不断的试验与调试,最终确定最佳高低阈值比取3∶1,代入函数,可得到实验结果如图6所示。
图6 边缘检测结果
将车道线轮廓提取出来之后,需要对其面积进行定量的测量,以计算其破损面积及破损率。本文的思路是先计算单位封闭区域的白色像素点个数n,则单位车道线面积Si即为白色像素点个数与单个像素点面积之积[15]。算法流程如下。
1)单位封闭区域内白色像素值为255,像素点个数为n。
2)设图像任意一点处P坐标为(x,y),求得其在该点处的灰度值。
3)做X方向和Y方向上的for循环,如果P的灰度值为255,则n++。
统计完单位区域内白色像素点的个数后,就可以通过式(6)算出总连通区域面积S。
式中:w为单个像素点面积。
则破损率计算公式为
基于OpenCV和C++实现该算法,求得该车道线破损信息如图7所示。
图7 车道线破损检测结果
本文提出一种新的、有效的车道线破损检测模式及区域面积计算方法,通过对实际公路车道线的实验验证,结果表明该方法具有很高的准确度。
1)针对车载相机与道路有一定夹角的问题,采用反透视变换,通过透视矩阵运算,将斜视图转换成了俯视图,为后期处理做准备。
2)对于传统轮廓检测方法无法用于边缘破损的车道线检测,提出在提取ROI区域时,运用Rect函数计算车道线总面积,可极大提高检测的准确度。