[自动驾驶]LaneLines-P1

车道识别,基于传统的cv方法。之前刚好弄过一个《使用opencv实现通过摄像头自动输入阿里云身份宝验证码》,opencv弄起来驾轻就熟,直接搞起来吧!

代码 https://github.com/udacity/CarND-LaneLines-P1

环境准备

懒得去练自己的深度学习devbox,直接在笔记本上搞吧。普通python环境,再加上opencv和moviepy就好。ffmpeg没有的话也提示你怎么装了。我用的是python2,把python3那几个希腊字母的变量名改掉就好,毕竟alpha,beta,theta我还是知道怎么拼的。

import imageio
imageio.plugins.ffmpeg.download()

霍夫变换

霍夫变换之前没用过。先学习学习。看了几个资料,都讲得很啰嗦,我再简单重复一下吧。简单来说,霍夫变换可以检测一堆点中,那些点在同一直线上。
穿过一个点,我们知道可以有无数条直线。但是如果有2个点,那就可以确定一条直线了。那怎么来找在同一直线上的点呢?
我们可以枚举
穿过点1的直线 L11 ,直线 L12 ,直线 L13 ……
穿过点2的直线 L21 ,直线 L22 ,直线 L23 ……
……

同一条直线有不同的描述方法,接下来一个预处理就是标记出相同的直线L,比如编号 l1 , l2 , l3 ……

剩下的就简单,wordcout一下就好,比如 lx 出现三次,表示 lx 这条直线穿过3个点。

上面的操作实际中怎么处理方便呢?就是转换到极坐标系。还是挺巧妙的。因为极坐标系很适合来描述一条直线(直线到原点的距离和旋转角度)。
opencv文档里的这个图相当不错
[自动驾驶]LaneLines-P1_第1张图片

处理思路

提示了cv2.inRange函数,刚开始觉得可以提取白色车道,黄色车道,路面,毕竟我们需要的就是整个路面的图像。
之前做项目,调颜色,用了MATLAB一个color thresholder的工具还挺不错的。记得用hsv颜色空间
[自动驾驶]LaneLines-P1_第2张图片

[自动驾驶]LaneLines-P1_第3张图片

然后hsv的颜色空间,h取值范围不是[0,255],是[0,179],见http://docs.opencv.org/3.2.0/df/d9d/tutorial_py_colorspaces.html

后来发现路面会取到周边一些杂七杂八的东西,效果不是很好,而且整条路的边缘也识别出来了。灵机一动,貌似取黄白车道就好了,车道本身就是人为画的,颜色比较鲜艳,跟自然景观的颜色还是很不同的。不过还是会有点问题,比如天空偶尔有一小块基本也是挺白的。


    mask=[
#yellow lane
            [(0.122*179, 0, 0.652*255), (0.137*179, 255, 255)]
#white lane        
           ,[(0, 0, 0.679*255), (179, 0.1*255, 255)] ]


    image_hsv_blur = gaussian_blur(image_hsv, 15)
    road_mask=np.zeros(image_hsv_blur.shape[:-1], np.uint8)
    for m in mask:
        image_selected = cv2.inRange(image_hsv_blur, m[0], m[1])
        road_mask = cv2.bitwise_or(road_mask, image_selected)

反正现在车道是能识别出来,只是偶尔会多出来一些杂七杂八的东西。

也赖得弄了,反正这种方法挺费劲,而且先天不足,鲁棒性一点都不好。nvidia用的End-to-End Deep Learning for Self-Driving Cars ,完全摒弃这种人肉提特征。
看看别人怎么弄吧,比如这个http://nbviewer.jupyter.org/github/yeutterg/CarND-LaneLines-P1/blob/master/P1.ipynb,原来自己用强规则把中间马路位置的一块三角形抠出来当作ROI。好吧,提示cv2.fillPoly 原本都不知有啥用,原来是这样。不过这样太傻,challenge的数据集就会嗝屁,我都拒绝用的。语义分割当然有更好的基于深度学习的方法,难怪dl一出来,秒杀传统的cv方法。

你可能感兴趣的:(机器学习)