都雪静,张美欧
(东北林业大学 交通学院,哈尔滨 150040)
目前,国内外车道线识别的主要研究集中在基于模型的方法和基于特征的方法两大类。基于模型的方法主要有霍夫变换[1-2]、最小二乘法[3-4]等,通过建立直线或者曲线模型来检测车道线。P.Pankiewicz等[1]运用霍夫变换的方法对车道线进行检测,引入并行计算提高识别效率,但此种方法受阴影和车辆的干扰影响较大,导致非车道线像素点混入,在增加计算量的同时,降低了车道线识别的精度。许华荣等[4]应用Canny边缘检测算法提取道路边缘,将B样条曲线模型与最小二乘法结合,配合霍夫变换的方法计算出道路中央线,此方法检测的效率不高。而基于特征的方法主要是通过图像的特征查找搜索车道线,例如线段检测器[4-6]、消失点投票法[7]等。Gioi R G V等[6]运用线段检测器提取所有潜在的车道线,结合K-Means聚类法和辅助判定条件,获得最佳车道线检测结果,但此种方法在车道线不连续时,准确性不高。Kong H等[7]和Rasmussen C[8]运用消失点投票法,通过投票在预定义区域来估计消失点,但在位置变换迅速的情况下不能准确地估计消失点。
针对无人驾驶车辆在在动态背景下车道线的识别效率,本文采用光流法与背景建模相融合的方法,排除背景无关像素的干扰,在一定程度上提高车道线识别的效率和效果。
在机器视觉应用中,由于光线投射导致实际对象物体跟投影到2D平面的图像不一致,因此,需要对相机进行标定,计算出畸变参数实现对后续图像的畸变校正。本文使用OpenCV(开源发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上)中封装好的函数实现相机的标定与校正。OpenCV源码在其sample/data目录下面有一个自带的校准棋盘图(chessboard.png),如图1(a)所示,将其打印出10张,摆放于镜头前的不同位置进行测试,通过棋盘格图片组计算出相机校正矩阵(camera calibration matrix)和失真系数(distortion coefficients)。有了目标点和图像点的角点信息后,利用OpenCV中的API(应用程序编程接口)矫正每1帧图片,则返回值是无畸变的图像。其中某一位置的棋盘格图片和角点识别后的棋盘格图片,如图1(b)(c)所示。校正后的棋盘格图片如图1(d)所示。
图1 棋盘格矫正图像
无人驾驶车辆在行驶过程中,车道线的检测是动态且实时的,本文运用OpenCV中的VideoCapture函数,通过数字控制不同的设备,改变函数的内置参数来捕获摄像头的实时视频流,通过循环代码不断显示下一帧图像,进而进行后续的处理操作。
一般来说,光流是由于场景中前景目标本身的移动,相机的运动,或者两者共同的运动产生的,是指空间运动物体在观测成像平面上的像素运动的“瞬时速度”,利用图像序列中像素强度的时域变化和相关性确定各个像素点的速度矢量特征[7],从图片序列中近似得到不能直接获得的运动场,可以对图像进行动态分析,在车道线的检测中,运用光流估计法观测车道线像素点的速度矢量特征进行检测,在检测的复杂度和实时性方面,都优于运用Canny算子、Sobel算子或复合算子等算子提取图像边缘信息。本文采用光流估计算法(lucas-kanade,LK)实时动态地预估车道线的范围,提取感兴趣区域的范围,进一步缩小车道线的范围后再使用图像分割算法,提高车道线识别的精度,最后在视频图像上进行标注。
在车道线的检测过程中,由于视频图像中,前提假设为车道线像素点在相邻帧之间的亮度是近似恒定的,且受车辆行驶速度的限制,相邻帧之间车道线像素点的运动比较“微小”,此外,同一个子图像的像素点具有相同的运动,满足Lucas-Kanade光流估计算法的前提假设。同时,车道线像素点的运动小且较为简单,因此其光流并不稠密,运用Lucas-Kanade光流估计算法识别车道线可以满足其精度要求[9-15]。
2.2.1 基本模型
设t时刻位于点(x,y)的像素值为I(x,y),在t+d t时刻其位置(x+d x,y+d y)在的像素值为I(x+d x,y+d y),由于相邻帧之间像素点的运动比较微小,因此:
泰勒展开后得到:
因此可以得到:
式中:u为像素点x轴的运动速度;v为像素点y轴的运动速度。
即:
因其同一个子图像的像素点具有相同的运动,将其拓展到更多像素即可得到:
若窗口大小为n*n,则共有n2个像素,n2个方程:
2.2.2 背景建模
在车道线检测过程中,需要将车道线信息作为前景,而车辆行驶过程中,天空中云朵的运动,道路两旁树的运动等需要将其作为背景滤除,因此本文针对图像中的背景采用混合高斯模型(GMM)进行模拟,区分出背景和前景像素。
假设混合高斯模型由k个高斯模型组成,则GMM的概率密度函数为:
式中:p(x|k)=N(x|uk,∑k)是第k个高斯模型的概率密度函数,p(x|k)=是第k个高斯模型的权重。
在遍历像素点的过程中,如果该像素值能够匹配其中的一个高斯模型,则认为是背景,否则认为是前景。主要算法步骤如下:
1)初始化高斯模型矩阵参数。
2)截取视频中t帧图像用来训练高斯混合模型。遍历第一个像素时将它作为第一个高斯分布。
3)遍历后续像素值时,与前面已有的高斯的均值比较,如果该像素点的值与其模型均值差在3倍的方差内,则属于该分布,并对其进行参数更新。
4)如果下一次来的像素不满足当前高斯分布,用它来创建一个新的高斯分布。
5)对新来像素点的值与混合高斯模型中的每一个均值进行比较,若其差值在3倍的方差内,则认为是背景,否则认为是前景。将前景赋值为255,背景赋值为0。视频中某一帧原图如图2(a)所示,处理后可以得到前景二值图,如图2(b)所示。
图2 背景处理图像
2.2.3 高斯滤波去噪
从图2(b)中可以看到,道路中央存在许多细小的不稳定噪音点,例如在路中央及车道线附近由于部分像素点光照条件的不同产生细小的噪音点,需要将其消除,以免干扰后续对车道线的提取操作。常用的滤波器有均值滤波、中值滤波和高斯滤波[16]。均值滤波使用模板内所有像素的平均值代替模板中心像素的灰度值,容易受到噪声的干扰,不能完全地消除噪声,只能相对地减弱噪声;中值滤波通过计算模板内所有像素中的中值并用其替代模板中心像素的灰度值,对于噪声并不是很敏感,只能够较好地消除椒盐噪声,容易导致图像的不连续性;高斯滤波将图像领域内不同位置的像素赋予不同的权值,能够较好地保留图像的总体灰度分布特征,因此,本文在背景建模后,进一步通过高斯滤波消除道路细小噪音点,如图3所示。
图3 高斯滤波后的前景二值图
由于车辆行驶道路环境比较复杂且在时刻变化着,因此为了保证车道线识别的实时性,缩短不必要像素的处理时间,增加识别精度,需要对视频图像进行ROI感兴趣区域的分割。传统的固定区域的ROI分割方法基于先验知识,将道路图像的上半部分作为背景,下半部分作为路面部分,虽然分割方法简单方便,但是对道路的要求较高,局限性较大,容易导致道路几何形状信息的丢失,识别结果不够鲁棒[17]。
本文运用基于边缘统计特性的自适应ROI分割方法,先使用OpenCV中的Canny边缘检测,Canny边缘检测通过高斯滤波器平滑图像,进一步滤除噪声,计算出每个像素点的梯度强度和方向,使用非极大值(Non-Maximum Suppression)抑制,消除杂散响应,应用双阈值(Double-Threshold)检测确定真实的和潜在的边缘,最后抑制孤立的弱边缘完成边缘检测,可以较为准确地得到边缘图像,如图4所示。
在道路图像中,越靠近车辆的部分,路面所占的比例越大,图像的内容越简单。距离车辆越远的图像越复杂,延伸到地平线的部分,道路背景产生的无效边缘越多,利用此边缘点的统计特性来确定感兴趣区域,识别出车道区域。
图4 道路边缘检测图像
根据路面处于视频道路图像下方的先验知识,将图像分为两部分,下半部分作为ROI分割线的搜索区域,将边缘点的像素赋值为1,若某点为边缘点,则Sij取值为1,统计ms行n列搜索区域内每行边缘点的个数Si,即:
假设第l行的边缘点个数最多,则将具有特征点个数最多的行Pl作为ROI分割线l,即:
运用上述图像分割方法,可以得到ROI分割线,如图5所示。
图5 自适应ROI分割图像
3.2.1 透视变换
采用仿射变换,可以保持原来的线共点、点共线的关系不变,保持原来相互平行的线仍然平行,保持原来的中点仍然是中点,保持原来在同一直线上的几段线段之间的比例关系不变[17-20]。因此,可以将感兴趣区域的图像转变为俯视图,计算出道路曲率,调用OpenCV的cv2.get Perspective Transform函数返回转换的矩阵M,Minv是反转换矩阵,warped是转换后车道线鸟瞰图方便后续划窗多项式拟合对车道线进行定位。此种方法能够找到多条车道线,实时性比较好。仿射变换后,车道线的俯视图如图6所示。
图6 仿射变换后的道路车道线图像
3.2.2 车道线位置定位
计算出鸟瞰图的像素直方图,在像素最多的位置作为车道线的起始位置,然后定义200*200像素的2个窗口向上做滑窗操作,以搜寻起始点作为当前搜寻的基点,并以当前基点为中心,做一个网格化搜寻,求出每个窗口中像素点的x和y坐标作为车道线的x、y坐标,当前窗口像素的平均x坐标作为下一个滑窗的中心位置,并对这些中心点做一个2阶的多项式拟合,得到当前搜寻对应的车道线曲线参数,用cv2.fitpoly函数拟合车道线曲线方程。
搜寻基点计算完毕后,需要将其进行更新,利用2阶多项式逼近之后,得到像素点x的坐标:
令y=img·height,即可更新搜寻基点。多次迭代计算后,可以得到若干个曲线方程,再用之前的参数方程进行平滑处理,而后,将曲线方程离散化后的坐标点取均值,再做2阶多项式逼近。有了曲线的方程,进而可以根据曲线的曲率半径的公式计算道路曲率Rcurve:
车道线拟合后,运用标线将车道线进行标注,并且画出直线围成的区域进行高亮,将其显示在原图上。
为了验证本文提出的方法,就识别效果与识别效率进行对比分析。
4.1.1 背景滤除效果
由于车道线颜色为白色和黄色,运用二进制阈值化和阈值法化为0对图像背景进行滤除,效果如图7所示。
图7 阈值化处理图像
以上2种方法在区分与车道线相近颜色的天空、云朵等背景时效果不佳,且在出现阴影遮挡车道线时,会出现车道线丢失的状况,而结合光流法和背景建模方法滤除背景,能够在动态情境中更加明显地突出车道线,将背景中运动微小的部分剔除,效果更加稳定。
4.1.2 去噪效果
结合光流法与背景建模法滤除背景得到前景二值图后,图像中存在较多不稳定的噪音点需要滤除,对比均值滤波与高斯滤波,如图8所示。运用均值滤波使图像的边界更加柔和,但道路中央的细小噪音点的去除效果不佳,相比高斯滤波器,对道路中的噪音点滤除效果较好,且车道线并没有模糊化,方便后续的处理。
图8 去噪后的图像
为了验证算法的识别效率,本文统计了算法改进前后的识别耗费时间,进而对比出识别效率,如表1所示。
表1 算法识别效率
结合光流法与背景建模法进行车道线识别,在保证识别效果的前提下,对算法的运行效率进行了一定的提升,本文提出的算法主要简化了前期图像处理的复杂度,缩小了感兴趣区域的范围,在一定程度上提升了车道线定位与标记的准确度。
为了验证算法的识别精度,将识别后的道路图像转换为鸟瞰图,如图9所示,计算其中心线,取其特征点与实际车道中心线的x轴位置坐标相对比,将中心线特征点x轴坐标与实际中心线x轴位置坐标之比转化为百分比作为其精度评价指标,进而计算出其精度数据,具体数据如表2所示。
图9 标注车道线后的鸟瞰图
表2 算法识别精度
本文中提出的结合光流法和背景建模的车道线识别算法,对比连续视频帧中车辆前方的背景的相对运动,滤除微小背景物体,突出前景车道线图像,并且为了减少计算量,对图像进行自适应的ROI分割,有效地提高了车道线识别的效果和效率,改进后的算法效率提升了43.9%。此算法为后续机器学习提升其识别的效率与精度提供了基础,在采集大量的道路数据集对其进行训练后,能够进一步提升识别的准确率,以达到在各种路况中准确识别车道线的要求。