实验名称:车道线检测
1.实验摘要
2.实验介绍
本项目是基于反透视变换和Hough直线检测完成的。要理解反透视变换首先要理解摄像机坐标系,成像坐标系和图像坐标系的关系。
1)图像坐标系(Pixel coordinate system)
摄像机采集的数字图像在计算机内可以存储为数组,数组中的每一个元素(象素,pixel)的值即是图像点的亮度(灰度),在图像上定义直角坐标系u-v,每一象素的坐标(u,v)分别是该象素在数组中的列数和行数。故(u,v)是以象素为单位的图像坐标系坐标。
2)成像平面坐标系(Retinal coordinate system)
由于图像坐标系只表示象素位于数字图像的列数和行数,并没有用物理单位表示出该象素在图像中的物理位置,因而需要再建立以物理单位(例如:厘米)表示的成像平面坐标系x-y,如图4.1所示。我们用(x,y)表示以物理单位度量的成像平面坐标系的坐标。在x-y坐标系中,原点定义在摄像机光轴和图像平面的交点处,称为图像的主点(principalpoint),该点一般位于图像中心处,但由于摄像机制作的原因,可能会有些偏离,在坐标系下的坐标为(u0,v0),每个象素在x轴和y轴方向上的物理尺寸为dx、dy,两个坐标系的关系如下:
其中s'表示因摄像机成像平面坐标轴相互不正交引出的倾斜因子
3)摄像机坐标系(Cameracoordinate system)
摄像机成像几何关系可由图4.2表示,其中O点称为摄像机光心,Xc轴和Yc轴分别与成像平面坐标系的x轴和y轴平行,Zc轴为摄像机的光轴,和图像平面垂直。光轴与图像平面的交点为图像主点O',由点O与轴组成的直角坐标系称为摄像机坐标系。OO'为摄像机焦距。
在获取视频中某一帧的画面时,获得的是一张二维的平面图,因为在视频中丢失了摄像机坐标系中Zc方向的数据,所以得到的是一张没有深度的图。要进行反透视变换就是要补充深度数据,即对二维图像进行Zc轴方向的拉伸。
完成二维到三维(实际上仍然是二维图像)的转变需要有三个不同的角变量对应三条轴线的透视变化,三个变量需要三个点来确定值。解出之后即可确定变换矩阵T,如果需要进行反过程只需对该矩阵求逆即可得到反过程的变换矩阵。
计算方法参考:http://www.docin.com/p-725340375.html
3.实验构思
1st. 对原视频进行反透视变换,将视角转变为鸟瞰图。
2nd.对视频进行一些预处理,如腐蚀膨胀,平滑处理等,设置ROI,减少画面中车道线以外的干扰物的影响。
3rd. 进行Canny变换,检测出画面的边缘并且对图像自动进行二值化处理。
4th.所得图像进行Hough变换,通过阀值,线段最短长度,连接为线段的最长间隔的设定来检测出画面中存在的直线。
5th.直线筛选,计算第四步所得线段的斜率,从中挑选符合要求的线段,并用cvLine函数标示到画面中。
6th. 将所得画面再次进行透视变换,变回原视角。
4.源码及注解
"code" class="cpp">/*
5.实验结果
最终实现图
如图,左上为原视角,右上为俯视图。左下三个窗口分别为Canny边缘检测结果,腐蚀膨胀结果,Hough变换结果。右下为最终结果。
该project是基于反透视变换实现的(其他实现方法包括基于成像模型的做法等),通过反透视变换为鸟瞰图,可以更好地检测直线。在检测前先通过预处理,设置更小的ROI,使检测区域集中于车(摄像头)正前方略多于一个车道宽度的位置(可以根据摄像头安放位置设定,如安排在车中线左侧,则ROI要偏右,使车子中心线所对与ROI中心相吻合)。此后再对灰度图像进行腐蚀与膨胀,去除掉一些影响检测结果的杂质元素。然后进行Canny边缘检测,去除杂质后,检测基本上能够只检出车道线的矩形。然后进行概率Hough变换,借助参数设置可以将车道线的短线段拼合为长线段。最后对所得线段进行筛选,只留下符合斜率要求的线段,并把所得筛选结果映回到视频中。
6.存在问题
该project实现了检测车道线的功能,对于杂质元素有较为良好的排除作用。在直线路段能很好地实现智能车的自动行驶。
直线路段有良好的检测效果
但由于使用了反透视变换的关系,若使用变换矩阵的逆矩阵重新投影回原视频,视频边缘会呈锯齿状并出现逸出的状况。
能达到无视标识的效果(针对路段上时会出现标示,文字等妨碍检测的杂质的情况)
存在问题:
出现杂线
由于使用的Hough办法为概率霍夫变换,因此在变道时,若车道线偏斜较多,在线段拼合时会出现这种线段交杂,连接错误的情况
转弯缺陷
由于要通过斜率来筛选车道线,因此在转弯时会出现直线斜率过大的情况,此时直线无法通过直线筛选,会出现一段时间画面没有指示线的情况。 是否存在一种方案可以使弯道时同样可以做出标识?但注意到转弯时车不在依照车道线方向行驶,因此认为此时不检测出车道线是正确的。
人行道障碍
还有一个存在的问题是人行道障碍。人行道是线段密集区域,由于进行了膨胀腐蚀算法,所以密集线的边缘会合并而变成块状。此时不会影响直线的检测。但是若边缘存在一些瑕疵,菱角,就会很容易像图中这样与画面中其他因素一起连接成线。这是不希望得到的结果,但这样产生的线很难通过斜率筛选来去除掉,由于太过紧密同样很难通过Hough变换参数的设置去除。
7.实验感想
opencv是非常强大的工具。这是我第一次接触到通过C语言来做实际应用的项目,之前做智能小车时,由于函数封装的原因,很多资料都难以在网上查找得到。但是opencv提供了一个相当广阔的平台。通过教材上的内容和网上的资料学会了很多opencv的知识。我暂且分为以下几点。
-1.对于一个视频,世界坐标系和图像坐标的不同,怎样从空间结构变为平面结构。用矩阵和图像结构存储的不同,颜色信息如何保存(double型数据),彩色图和二值图如何转换(opencv中一些函数是基于二值图完成的,如果要保留颜色信息,可以通过分通道操作来完成,如RGB图分解为三个单通道图来分别操作),摄像机视角和鸟瞰视角如何切换(反透视变换矩阵)。怎样建立模型存储图像和视频中的信息(对不同坐标系的理解和转换方法)。
-2.如何对视频进行预处理(模糊,腐蚀,膨胀等等),每种操作opencv都提高一个完善的函数来实现,可以通过调节函数参数来得到自己想要的效果。减少画面中的障碍和杂质,使得画面更利于接下来检测的工作(无论是车道线检测还是行人、车辆检测,进行恰当的预处理会大大有利于之后的特征提取算法的运用)。
-3.ROI的概念,当视频画面中我们只需要对某一区域进行扫描和判断时可以对它设置恰当的ROI,当我们需要回到完整画面处理时可以释放ROI。同时注意到如果在设置ROI前进行了矩阵变换,则进行逆变换时必须回到进行矩阵变换当时的那个ROI区域。否则画面的比例是不一致,做不出理想的效果的。
-4.同时,opencv还可以完成丰富的UI设计,包括滑动条,标题,颜色等都是可以自定义的,通过调节这些可以提高视觉效果,尽管这些并非是算法范围内的事情,但是一个好的界面和布局,能为程序员编程和debug带来更多乐趣,也能为完成项目后,使用作品的用户带来更友好的用户体验。用opencv来完成一个小型的Photoshop软件也是可能的(可以调整图像亮度,对比度,剪裁,模糊图像,腐蚀膨胀等效果可以改造为滤镜效果),这是非常棒的事情,因为我个人对图像处理比较热爱,所以对这方面也相当感兴趣,希望接下来能继续完善和做出一些更有趣的东西。
8.参考文献
-1.A Flexible New Technique -Zheng you Zhang,IEEE
-2.基于反透视变换和Hough变换的车道线检测 - 张云港
-3.3D坐标系变换 –ryfdizuo,CSDN论坛
引用网址:http://blog.csdn.net/ryfdizuo/article/details/6287637#t1
-4.OpenCv霍夫变换:霍夫线变换,霍夫圆变换合辑 - 枫落★流年
引用网址:http://www.tuicool.com/articles/Mn2EBn
-5.OpenCv学习笔记-滚动条随着视频播放而滚动- xiongyan10
引用网址:http://blog.sina.com.cn/s/blog_4b826e5b01015xoj.html
-6.世界坐标系
引用网址:http://baike.baidu.com/view/829500.htm