具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步的详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定发明。
本发明的目的在于提供一种车道线识别的方法,该方法包括以下步骤:
在步骤一中,对所获取的视频图像进行二值化预处理;
在步骤二中,搜索车道线的可能像素点,同时模拟产生车道线的可能像素点;
在步骤三中,产生车道线搜索区域,在搜索带里面寻找车道点,拟合画出车道线。
在本发明实施例中,该方法所获得视频的像素大小是512*288,视频的颜色模式是RGB,视频摄像头安装在汽车前方挡风玻璃的右上方位置,且汽车行驶在车道的中间位置时摄像头与左边车道和右边车道的距离比为9∶2。
在本发明实施例中,该方法通过扫描寻点和图像处理寻点的两种方式搜索车道线的可能像素点。
在本发明实施例中,搜索区域的搜索带可分为4种:车道线与屏幕的左边栏相交,这时搜索带是从左往右搜索,搜索够9个点就结束搜索;车道线与屏幕的底部相交,这时搜索带就从下往上搜索,搜索得到9个点后结束;车道线与屏幕的右边栏相交,这时搜索带是从右往左搜索,搜索够9个点就结束搜索;当车辆在拐大弯时,由于拐弯的时候用的是曲线描绘车道线的方式,要尽量的往车道的远处找点,跳过近处的一些点。
在本发明实施例中,在搜索带里面寻找车道点分为两个步骤:第一步,在扫描线上找车道线的点;第二步,筛选在扫描线上找到的车道线的点。
在本发明实施例中,在扫描线上寻找车道线的点时,为了让计算简单,直接在边缘检测到的图像进行车道线上的点的识别,识别车道线上的点分为3类:扫描带是从左边延伸到中间或者从右边延伸到中间的,这是用的方式是沿着扫描线从底部往上搜索;扫描带是从底部的左半部分延伸到中部的,这时要从右往左识别;扫描带是从底部的右半部分延伸到中部的,这时从左往右识别。
在本发明实施例中,筛选在扫描线上找到的车道线的点时,去除错误点方法是:对于每一条车道线来说,先就是一些首先识别出来的4个点,拟合出这4个点形成的车道线的斜率,然后根据这个斜率计算出下一个识别出来的点的位置,用这个计算出来的值与从图像中识别出来的值做比较,如果相差比较大,说明这个点应该去掉。
在本发明实施例中,拟合画出车道线时,由于车辆在拐弯时和在直道上行走时相差比较大,分两种情况来对车道线拟合;
不拐弯时,用最小二乘法拟合实现,这里的不拐弯也包括在高速公路上的情况,因为高速公路在拐弯时,拐弯的半径比较大,可当作直线来处理;
拐弯时,选择用贝塞尔曲线来画出车道线。
在本发明实施例中,在拐弯时使用的是贝塞尔曲线,这是四个点画一次曲线,当计算出来的点不是四的倍数时,在不是4的倍数的情况下添加到4的整数倍,所添加点的值等于最后一个能够正常计算出来的有效点的值。
下面结合附图及具体实施例对本发明的应用原理作进一步描述。
该方法中用到的视频的像素大小是512*288,视频的颜色模式是RGB,视频摄像头安装在汽车前方挡风玻璃的右上方位置,且汽车行驶在车道的中间位置时摄像头与左边车道和右边车道的距离比为9∶2。
图像的预处理
由于该方法中用到的视频摄像头安装在汽车前方挡风玻璃的右上方位置,且摄像头与左边车道和右边车道的距离比为9∶2,俯视角度调整的原则是要保证屏幕的中线刚好是路面的消失点,故可只处理后半部分的图片。
图像的二值化
图像处理过程的第一步就是要对图像进行二值化,为了减少处理的过程我们直接对RGB图像做二值化处理,而不是先把它变成灰度图像。二值化的效果如图3。
首先对图1处理前的图片的图像的像素点的亮度做一些统计,统计的结果如下:
统计整个图1处理前的图片的像素点亮度的分布情况,如图4;
统计图1处理前的图片下半部分0.5高度的像素点强度的分布情况,如图5;
统计图1处理前的图片下半部分0.4高度的像素点强度的分布情况,如图6;
统计图1处理前的图片下半部分0.3高度的像素点强度的分布情况,如图7;
从上边这四个图中可以得到下面的信息:
1、从图1处理前的图片和其他这三个图有着很大的区别可以得知,图像上半部分的信息会对整个像素点亮度的分布产生比较大的影响,这些影响来自车辆前方风景的改变,天上的云,车道傍边的楼房、树木,道路的标示牌等。
2、图6下半部分0.4高度的像素点亮度分布和图7下半部分0.3高度的像素点亮度分布是比较的相似,因为这一部分基本上就是车道还有车道线,就算车道傍边有其他建筑物等也不会对图6下半部分0.4高度的像素点亮度分布和图7下半部分0.3高度的像素点亮度分布的像素点亮度大于110的分布造成太大的影响。
3、从图5下半部分0.5高度的像素点亮度分布相对于图6下半部分0.4高度的像素点亮度分布和图7下半部分0.3高度的像素点亮度分布的区别可以看出是由于是远方的道路反光比较的严重,所以远方的路面亮度会比较高。
4、从图6下半部分0.4高度的像素点亮度分布和图7下半部分0.3高度的像素点亮度分布取波峰之后的值作为车道线的亮度的取值范围是准确的。
有了这个信息的准备就可以做阈值的自动获取计算了,这样可以实时的得到更理想的二值化图像。
阈值自动获取的伪代码如下:
阈值=0;
//程序中是用数组存取的分布情况
临时变量=0;
循环(变量1=255;变量1>=0;变量1--){
如果(数组[变量1]>400){
跳出循环;
}
}
//到这里变量1里面存贮的是从横坐标由大到小第一次遇到一个大的值
//由于【图3】和【图4】这种情况,最大值都是突然下降的,而且是在5个像素点内下降结束的
阈值=变量1+10;
循环(数组[阈值]>40并且阈值<255){
阈值+=4;
}
统计分布划分情况:
这里算出来的阈值为:105
用105为阈值对图像处理之后我们就得到二值化图像图3。
车道线可能像素点的搜索
这是一个初期的车道线的判别,在这个阶段判别用到的策略就是宁缺勿滥,意思是说宁可少识别出也不要去识别到错误的点,如果这个阶段识别出来的值存在问题的话,会直接的影响到下一个过程的扫描区域的动态生成。如果扫描区域出了错,好的情况下就是识别不出车道线,在坏的情况下就错误的判断车道线的轨迹,这样就很可能会触发错误预警。
本发明用到两种办法来搜索车道线:
①扫描寻点
②图像处理寻点
扫描寻点:
扫描寻点算法的可行性分析
1、车道线的介绍:车道线分为实线和虚线
一、实线
如果是实线的话,在二值化的结果比较理想的情况下,那么车道线会一直延长到视频屏幕的底边或者侧边上。
二、虚线
标准的车道线在画虚线的时候,如果有多于两条的车道线的话那么车道线是同时出现的,如下图10所示。
2、由于摄像头拍摄到的路面的宽度在一定的小范围里面,而且不能有3条车道线同时与底部的相交,最多的情况下也只是2条,所以如果离车辆最近的四条车道线都是虚线的话车道线会与屏幕底部相交,如果不和屏幕底部相交的话那就会与屏幕侧边相交,如下图11所示;
图11标准虚线车道线会与屏幕边缘相交
视频摄像头是放在汽车前方挡风玻璃的右上方位置,所以得到的图像的视角会偏右。
从图11标准虚线车道线会在视频中与屏幕边缘相交,当B点和C点与底部相交时可以正常得到交点,但是在当B点和C点没有和扫描带相交,所以A点和D点由于提前遇到了扫描线而被检测到。
而且由于摄像头不是放在中间的位置,在车辆直向行驶时,A点和D点不会同时被能检测到。
综上所述,扫描图11标准虚线车道线会在视频中和屏幕边缘相交中扫描带的部分是可以找到一定数量的交点。
扫描寻点的应用
首先对图像的下半部分进行分块,如下图12;
分块的方式使用的是8x8的分块,分块的思想就是统计二值化中的每一8x8的分块的像素点,白点多的块则显示为真值,反之为假。
本发明中没有对整个图片的下半部分做分块处理,由于搜索带只是在其边缘的位置,所以只要做(512+144*2)/8-2=98块的分块处理,这会占用很少的计算时间。
边缘点的检测过程:
1.首先搜索屏幕底部边栏部分
①定义:变量1;
②从左往右搜索,遇到白点赋值给变量1,进入到退出白线区域的状态;
③遇到黑点,值减去变量1,如果差值在一定的范围内,而且与上一个识别出来的点有一定的距离,保存该点。进入到搜索下一条车道线的状态;
④重复②、③步骤直到搜索完底部所有的点。
2.搜索屏幕左侧边栏
①检查屏幕底部边栏最左边几个点是否为真,为真的就往上跳几个点,说明这些点可能重合;
②从底部往上搜索,用和底部边栏扫描一样的方法,不过这里只需要选择第一个得到的点。
3.搜索屏幕右侧边栏1与左边栏相似。
图像处理寻点
由于屏幕侧边的检测是只有比较准确的时候才会去识别,所以在当屏幕侧边检测得出的点比较的少时采用图像处理的方式寻点从而找出更多的点,或者对边栏检测出来的点进行调整。
1.图像处理方法可行性分析
①远处的物体看下去会比较的小,所以当车道线延长到远处的时候会慢慢的变细。如对其做腐蚀运算,那么不管前方的车道是拐弯还是直线都会被腐蚀掉,只会剩下近处的车道线,而且是很直的。这时在用霍夫处理,就会只剩下为数不多的几条线了。
②远处的或者车道傍边的物体和车道线有一个很不一样的特征,车道线是一条长的白色的带状,边缘检测后就是两条很靠近的曲线或者直线,如果对其进行填充处理,那么车道线就很容易被填充,而由于其他物体没有比较规则的相近的边缘,所以很难填充,进一步对图像做消减处理能把很多边缘去掉,这时用圆滑方式对图像进行膨胀处理,这时除了车道线是白色的带状外,其他的就成了一个个小白点。之后再做霍夫运算就可以把车道线给检测出来,而且不会有其他的干扰。
2.图像处理的过程
通过图像处理寻点过程的处理过程之后把剩下的线段延长到底部和左右侧边的下半部分,再通过比较相交点的位置得到一个比扫描寻点更准确的车道初始点。
只有当扫描寻点的方式找不到点时或者说找到的点和上一帧的点相差得比较大,就需要图像处理的方式去进一步处理才能得到正确的初始点。
把霍夫运算得到的直线的斜率记录下来以备后面扫描域时使用。
综合上述,可以准确获取车道线与侧栏的相交点的信息。
车道线可能像素点的模拟产生
已经找到了部分的车道线与侧栏的相交点信息,但是由于车道线有虚线的情况还有因为光照影响太强烈使得二值化的结果不准确,导致没有找到车道线与侧栏的相交点位置。这时就需要模拟出丢失的点或者说是没发现而确切存在的点。如下图13;
从图13未识别点的模拟生成中可以看到左车道线的边栏检测并没有找出左车道与屏幕底部的交点,本方法能够准确计算出这个点的位置。
下面介绍点的模拟过程:
边栏上的点虽然不能全部检测出来,但是大部分情况下是可以找到部分点。
所以就可以通过计算的方法找到那个没有识别出来的点。
对于一种车道为直线的情况:
图14未识别点的模拟生成解析,在图中找到了车道线和侧栏的两个相交点G和H。
把线段BC转90度角放到线段AC的位置,同理把线段DE也转90度转到DF的位置。
视频的宽度为512像素,所以这里的CD的长为512。
视频的高度为288像素,所以线段BC和线段ED的长度为288/2=144。
中国标准的高速公路的车道宽度如下:
①双向四车道的车道的标准宽度为2*7.5米。所以平均每一个车道的宽度为:(2*7.5)/6=2.5米;
②双向六车道的车道标准的宽度为2*11.25米。所以平均每一个车道的宽度为:(2*11.25)/10=2.25米;
③双向八车道的车道标准的宽度为2*15米。所以平均每一个车道的宽度为:(2*15)/14=2.14米。
综上所述,中国标准车道的平均宽度为2.2米。
汽车车型的尺寸:
表1各类型汽车的尺寸
从表1各类型汽车的尺寸得到信息,按宽度分大概分为两种:一种平均宽度在2米左右;另一种在2.5米左右。如果是微型的汽车或者迷你的小汽车比第一种还要小3~4公分。
按照一个比较中等的类型即小型车来算,也就是说车的宽度是1.8米。
当汽车在直道的路面上行驶时,而且刚好行驶在车道的中间位置。这里计算一下摄像头角度和离车辆最近的左右车道的距离比。
车辆离车道的距离:(2.2-1.8)/2=0.2米。
由于摄像头与车最右侧的边框距离应为0.2米,所以摄像头与右边车道的距离:0.2+0.2=0.4米。
摄像头与左车道的距离:2.2-0.4=1.8米。
所以摄像头与左边车道和右边车道的距离比为:1.8/0.4=9∶2。
摄像头获取到的图片的宽度为512像素。
根据中央车道线在图片中的最大宽度只占屏幕的5/7,即图14未识别点的模拟生成解析中的IJ点,所以默认的车道线远处的消失点(即图14未识别点的模拟生成解析中的K点)为:
横坐标:(512*2/7)/2+(512*5/7)*9/11=372(pix)。
纵坐标:288/2=144(pix)。
得到点K和点H的位置可以计算出点M的距离。
当点H映射到线段DF上时不是直接DH等于DM,而是先通过点I和点J的位置获取斜率的系数计算出M的距离。
综合上述,在当某些点没有检测出来时可以通过已经识别出来的点对其进行计算得到,因为图14未识别点的模拟生成解析的点LIJM是一起运动的,所以这时是点L和点I往左移动,点J和点M往右移动。总是可以把没有识别出来的点计算出来。
车道线搜索区域的产生
按照上述可以得到车道线和屏幕边缘的相交点和车道线远方的消失点位置。通过这些信息可以建立起相应的搜索区域来搜索车道线。
下图15是搜索区域的图片:
搜索区域的搜索带可以分为4种:
①车道线与屏幕的左边栏相交,这时搜索带是从左往右搜索,搜索够9个点就结束搜索。
②车道线与屏幕的底部相交,这时搜索带就从下往上搜索,搜索得到9个点后结束。
③车道线与屏幕的右边栏相交,这时搜索带是从右往左搜索,搜索够9个点就结束搜索。
如图16车道线的搜索带所示的左车道线。
④当车辆在拐大弯的时候,由于拐弯的时候用的是曲线描绘车道线的方式,所以会在车道的远处找点,会跳过近处的一些点,如图17。
在搜索带里面找车道点
有了搜索带后需要在搜索带上面找车道线的点,这里分为两个步骤:第一步,识别出车道线上的点;第二步,剔除不可能的点。
在扫描线上找车道线的点
直接在边缘检测到的图像进行车道线上的点的识别,识别车道线上的点分为3类:
1.扫描带是从左边延伸到中间或者从右边延伸到中间的,这时用的方式是沿着扫描线从底部往上搜索,如图18;
2.扫描带是从底部的左半部分延伸到中部的,这时从右往左识别,如图19;
3.扫描带是从底部的右半部分延伸到中部的,这时从左往右识别,如图20;
方式1从下往上搜索是因为这条车道线的下半部分的事物比其上半部分的事物的简单,如果这条车道线是最边缘的一条车道线时,那么车道线左上部分的事物就是道路以外的事物,情况比较的复杂,而其右下部分的扫描带上的区域还属于路面上的范围,道路的颜色比较单一所以采取此搜索方式。
方式2和方式3的搜索方式也是为了避免车道外的事物的干扰。
综上所述,找点的方式是在边缘检测后的图片里按从路面往外扩张的方向搜索,把识别出来的第一个最近的两个点的中值预定为车道线的点,提供给后面做筛选部分处理。
筛选在扫描线上找到的车道线的点
由于图像干扰的因素很多,二值化后的图像中还有很多干扰的信息,比如道路上行驶的别的汽车或者道路上面的水渍等都会使得识别出现偏差。还有就是由于模拟出来的车道线的远方的消失点不正确导致扫描带严重偏移。
去除错误点这里用到的方法是:对于每一条车道线来说,首先识别出来4个点,拟合出这4个点形成的车道线的斜率,然后根据这个斜率计算出下一个识别出来的点的位置,用这个计算出来的值与从图像中识别出来的值做比较,如果相差比较大的话说明这个点是错误的应该去除。
下面简单举例,说明去除错误点的方法能达到什么效果:
从图21二值化图像中,由于之前用到的在搜索带上识别车道线上的点的方式,这样就会把另一条车道线上的点识别出来,而这些点在识别的时候应该要去除。通过去除方式后得到的点为图22所示。
如图22,由于被识别出来的点和计算出来的点偏差比较大,所以被去除,图20去除错误的示例中剩下6个黑点用于后面的直线拟合。黑点表示识别出来的点,红点是模拟出来的点。从左往右数“第5和第6个点”由于与“识别出来的点和模拟出来的点”相差比较大所以就被剔除。
拟合画出车道线
车道线的一些点已经标示出来,需要拟合画出车道线。
由于车辆在拐弯的时候和在直道上行驶的时候相差比较大,所以分两种情况来对车道线拟合。
1.不拐弯的时候,用最小二乘法拟合实现,这里的不拐弯也包括在高速公路上的情况,因为高速公路在拐弯的时候,拐弯的半径比较大,可以当作直线来处理。
2.拐弯的情况,选择用贝塞尔曲线来画出车道线
在选择用什么方式来画车道线之前首先得判断一下当前状态下是拐弯还是不拐弯。
拐弯和不拐弯的判定
当车道在拐弯的时候,其实车辆是要往弯道的内道上开才能正确的拐弯的,否则就会冲出道路。
在拐弯的时候汽车是要做偏离本车道运动的动作,当汽车向右拐弯,其实从操作汽车的角度来看,相对来说驾驶员是想开到其右边的车道上,而这一动作在直道上的时候不可能维持很长时间,在拐弯的时候却可以,根据这个现象,来区分出汽车是在拐弯还是在直道上行驶。
对在拐弯时和直道行驶时的车道线与底部交点的运动轨迹进行比较。
①直道行驶时的记录痕迹,如图23;
②拐弯行驶时的记录痕迹,如图24;
这两张图的第一行上的圆圈表示在处理这第n帧图像时得到的车道线与屏幕的相交点,每一行直线被分为四个区(图14中“A、C、K、D、F点”划分的四个底边区),第一个区表示这个相交点是在屏幕的左边栏上得到的。第二区表示是在屏幕的底边栏上的左半部分,第三表示的是底边栏上的右半部分,第四区表示交点在右边栏上。第二行表示第n-1帧的数据,第三行表示n-2帧的数据,以此类推到第七行。第8行是前七行的全部数据的叠加。
从这两幅图中的区别可以看出,因为在直道上行驶时,如果汽车要拐弯,车道线和屏幕底部的相交点就不可能不移动,它不仅要移动而且是沿着同一个方向移动。这显然可以判定是在直道上行驶。
而拐弯的时候却不一样,由于弯道有一定的路程,在弯道上行驶的时候相当于汽车想往内道上拐弯,弯道的路程使得这个状态得以保持,所以车道线和屏幕底部上的相交的就不会有很大的偏动。至少不会一直沿着一个方向移动,要动的话它只能是来回的摆动。
这里不仅可以用作判断是否拐弯的信息处理还可以用于下一帧的车道线与屏幕底部交点的预测。
不拐弯情况下车道线的拟合
在不拐弯的情况下使用的是最小二乘法直线拟合。
下边是最小二乘法的伪代码:
向量x;//存参加拟合点的x值
向量y;//存参加拟合点的y值
变量A=(变量x*变量x).sum();//各个变量x的平方和
变量B=(变量x).sum();//各个变量x的和
变量C=(变量x*变量y).sum();//各个点中变量x和变量y乘积的和
变量D=(变量y).sum();//各个变量y的和
变量temp=(变量A*变量x.size()-变量B*变量B);
如果(变量temp){
斜率=(变量C*向量x.size()-变量B*变量D)/变量tmp;
B值=(变量A*变量D-变量C*变量B)/变量tmp;
}否则{
斜率=1;
B值=0;
}
通过上面的计算就可以得到直线的斜率和直线与纵坐标的交点B值,拟合的效果,如图25。
拐弯情况时车道线的拟合
在拐弯的时候使用的是贝塞尔曲线,这是四个点画一次曲线,当计算出来的点不是四的倍数时,那么在划线的时候由于没有足够四个点所以后面的余数就没办法画出来。解决方法是:在不是4的倍数的情况下添加到4的整数倍,所添加点的值等于最后一个能够正常计算出来的有效点的值,拟合出来的车道线效果如下图26。
本发明实施例提供的车道线识别的方法,首先对所获取的视频图像进行二值化预处理;然后搜索车道线的可能像素点,同时模拟产生车道线的可能像素点;最后产生车道线搜索区域,在搜索带里面寻找车道点,拟合画出车道线。该车道线识别的方法,计算过程简单,识别准确率高,有效地满足了现实使用需要,可动态跟踪车道线识别出车辆的运行状态,为司机的安全可靠驾驶提供了可靠地保证,实用性强,具有较强的推广与应用价值。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。