无人驾驶之车道线检测

介绍

  这是Udacity无人驾驶第一学期的第一个项目–车道线检测,项目要求从所提供的道路图像和视频流中识别并标注出左右两侧的车道线。课程方提供了完成这个项目所需的ipynb工程模板、示例和相关素材,我们可以从Github上找到udacity/CarND-LaneLines-P1,下载到本地并进入项目文件夹:

git clone git@github.com:udacity/CarND-LaneLines-P1.git
cd CarND-LaneLines-P1

  启动之前建立的Anaconda的carnd-term1环境和jupyter页面:

activate carnd-term1
jupyter notebook

  可以跳转到浏览器端的jupyter页面,点击P1.ipynb就可以进入项目的编程界面。课程方已经为我们提供了程序的框架,并封装了一些辅助函数(主要是cv2的API),需要我们实现的有两个部分,一个是车道线检测的流程process_image 函数,还有一个是用于车道线标注的draw_lines函数。下文将主要记录我的实现思路,具体代码托管在我的github上。   

git@github.com:hewangxing/CarND-LaneLines-P1.git

车道线检测

  识别车道线的程序像流水线一样,分为以下六个步骤:
  第一步,将彩色图像image转换为灰度图像,grayscale();

  第二步,对灰度图像进行高斯滤波,抑制噪声, gaussian_blur();
  第三步,运用Canny算子进行边缘提取,canny();

  第四步,选择图像中的感兴趣区域ROI,region_of_interest();

  第五步,通过霍夫变换检测直线并标注,hough_lines();

  第六步,图像叠加显示最终结果,weighted_img()。

车道线标注

  通过霍夫变换得到的是一些线段,我们希望用两条实线分别表示左右车道线,因此需要修改draw_lines函数。实现思路:首先通过直线斜率或者倾斜角对左右线段进行分类,然后求均值并计算左右直线方程,用np.poly1d计算出靠近ROI边界的端点坐标,最后用cv2.line画出左右车道线。

问题和改进

  程序最初是针对test_images中的道路图像进行开发的,功能实现后就填充到process_image()用于视频中车道线的检测。经过测试和修改,在solidWhiteRight.mp4和solidYellowLeft.mp4中运行效果良好,但在稍复杂的challenge.mp4中的表现就差强人意了,一方面是由于背景中有较多干扰线段出现,另一方面部分路段颜色与黄色车道线较难区分。因此,还需要在算法的稳健性上下点功夫,也说明了手动调节参数很难保证程序的通用。
  
编程中遇到的一些其它问题:
  1.视频程序运行几遍后经常奔溃OSError, 解决办法是Kernel->Restart & Clear Output, 然后重新运行Run All。
  2.一些opencv的API、python第三方库等不熟悉,使用出错,比如数组的维度不匹配等。