无人驾驶 OpenCV (1) 识别车道线
![](https://img.haomeiwen.com/i8207483/da98f2c997942bcd.jpg)
分享通过简单实例介绍无人驾驶是如何识别图像中有助于驾驶的车道线,比较基础主要目的让大家熟悉 opencv。
电动汽车
说到电车就会想到特斯拉和比亚迪,不过世界销量第一是日产,现在来看所有的传统汽车巨头都也有垂涎电车领域,都有在电动车产业有不小投入。多半比较保守走到都是混合动力,日产是纯电。现在 BMW 3系和5系也上电动车。
![](https://img.haomeiwen.com/i8207483/a43887041571be42.jpeg)
共享汽车
共享汽车已经走入我们生活,而被我们所接受和习惯。
![](https://img.haomeiwen.com/i8207483/861d43bdf29fc45f.jpg)
车联网
其实通过车联网,可以暴露我们的数据,我们汽车保养和维修都会被记录下来供分析
无人驾驶
其实特斯拉的无人驾驶技术并不是那么NB,但是特斯拉有胆敢上路,其实我们应该为特斯拉的敢于突破而给予支持。起码不要抵触和嘲讽特斯拉的无人驾驶就好了。除了特斯拉我们还要感谢 google 把无人驾驶的技术从校园带到了大众面前。
为什么看好无人驾驶呢
首先无人驾驶安全
全球每年 130w 人死于车祸,185 亿损失,其中是 driver 不够集中,更有人比较激进提供“谁再阻止自动车上,就是等同于在杀人”。一些疲劳驾驶是导出车祸的一个重要原因。而且我们可以将驾驶时间节省下来,干一些有意义事来创造更多GDP,所以多数国家也大力支持研发和发展无人驾驶技术。城市变得越来越大所以我们花费在通勤时间应该都不少于 30 分钟以上。
而且以后结合深度学习,想象一下我们车除了接送我们,平时还能为我们赚点外块。
说了半天有关无人驾驶即使说上一两天也只是粗浅的知识,我们可以慢慢来,感兴趣吗。一切都是从感兴趣开始,最起码我们学到如何使用 OpenCV 来处理图像。
读取路况图片
import cv2
通过读取 imread 方法读取图片,有关在 OpenCV 中如何读取写入图片请参考
计算机视觉 OpenCV (1)
image = cv2.imread('test_image.jpg')
cv2.imshow('result',image)
cv2.waitKey(0)
![](https://img.haomeiwen.com/i8207483/3cda8447c1a539a9.jpg)
去色
识别出物体的分界线,颜色对识别帮助并不大,我们需要通过灰白度对比来找到区分不同物体的边界线。所以一张黑白灰图就够用了,所以我们可以处理图片为灰度图。
image = cv2.imread('test_image.jpg')
# copy not reference to
lane_image = np.copy(image)
gray = cv2.cvtColor(lane_image,cv2.COLOR_RGB2GRAY)
cv2.imshow('result',gray)
cv2.waitKey(0)
![](https://img.haomeiwen.com/i8207483/eac3b580cc5de7e7.png)
降低噪点
我们可以通过模糊(blur)方式来减少图片的噪点这样更有利于查找边界
在灰度图每一个像素都是一个单一值来表示,表示图像灰度值,通过改变深色周围的像素灰度值来实现模糊(或者说是平滑)这里我们会创建一个卷积核。高斯模糊本质上是低通滤波器,输出图像的每个像素点是原图像上对应像素点与周围像素点的加权和,原理并不复杂。如何了解了卷积神经网络这应该就不难懂了。
卷积神经网CNN(1)
![](https://img.haomeiwen.com/i8207483/a33cf54268cc13c9.jpg)
从图中我们可以看出高斯模糊对图片边缘进行模糊处理。
![](https://img.haomeiwen.com/i8207483/9a67383b25f444f4.jpg)
我们的图片是由表示灰度的像素组成,像素值差距大地方会明显梯度下降感觉会造成图片不够平滑和连续,这就需要我们模糊对这些比较锐利的边缘进行处理。
![](https://img.haomeiwen.com/i8207483/cc3a632a20969ca2.jpg)
这个就是由加权值组成的卷积核,卷积核在图像进行游走来并和经过的像素点进行计算来达到模糊作用,这就是高斯模糊的和其他模糊的算法。
![](https://img.haomeiwen.com/i8207483/de05bad14336fa4f.jpg)
高斯模糊之所以叫高斯模糊,是因为它运用了高斯的正态分布的密度函数
![](https://img.haomeiwen.com/i8207483/c8d1ed81b3342fb1.jpg)
blur = cv2.GaussianBlur(gray,(5,5),0)
![](https://img.haomeiwen.com/i8207483/28b12191ae061581.png)
Canny边缘检测算法
获取图片的边缘信息是底层数字图像处理的基本任务之一。边缘信息对进一步提取高层语义信息有很大的影响。这也有助于我们对图像物体进行识别
![](https://img.haomeiwen.com/i8207483/ec029bac84bd5f8b.jpg)
过渡分为两种一个强过渡一种是弱过渡
![](https://img.haomeiwen.com/i8207483/3c68fbd0c99b2184.jpg)
过渡强弱是我们判断是否边缘的依据,我们可以通过阈值来指定那些是我们要找的过渡将这些过渡作为边缘,那些是我们忽略过渡。
![](https://img.haomeiwen.com/i8207483/f221a20844636c4e.jpg)
这里就需要一个类似神经网激活函数,来确定那些是用于判断边缘那些不是。
![](https://img.haomeiwen.com/i8207483/603c93d51c1d2735.jpg)
canny = cv2.Canny(blur,50,150)
cv2.imshow('result',canny)
![](https://img.haomeiwen.com/i8207483/4be3173f7b5f299e.png)
整理代码
import cv2
import numpy as np
def canny(image):
gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
blur = cv2.GaussianBlur(gray,(5,5),0)
canny = cv2.Canny(blur,50,150)
return canny
# read image
image = cv2.imread('test_image.jpg')
# copy not reference to
lane_image = np.copy(image)
canny = canny(lane_image)
cv2.imshow('result',canny)
cv2.waitKey(0)
将对图片进行去色、模糊以及边缘检测一系列处理整理到 canny 这个函数。
import matplotlib.pyplot as plt
plt.imshow(canny)
plt.show()
![](https://img.haomeiwen.com/i8207483/b91778a1c38d20ab.png)
def region_of_interest(image):
height = image.shape[0]
ploygons = np.array([[(200,height),(1100,height),(550,250)]])
mask = np.zeros_like(image)
cv2.fillPoly(mask,ploygons,255)
return mask
cv2.imshow('result',region_of_interest(canny))
cv2.waitKey(0)
![](https://img.haomeiwen.com/i8207483/8896b827092b0a3e.png)
应用遮罩
通过 bitwise_and 对两个图像的每一个像素做 and (与)预算来将遮罩应用我们图像,这个如果大家有 Photoshop 经验应该不难理解。
def region_of_interest(image):
height = image.shape[0]
ploygons = np.array([[(200,height),(1100,height),(550,250)]])
mask = np.zeros_like(image)
cv2.fillPoly(mask,ploygons,255)
masked_image = cv2.bitwise_and(image,mask)
return masked_image
![](https://img.haomeiwen.com/i8207483/547b02d7d4638872.png)
暂时就到这里