自动驾驶感知-车道线系列(一)——车道线基础流程实现

车道线基础流程实现

  • OpenCV的安装
  • 图片的读取,展示和保存
  • Canny边缘检测
  • ROI_Mask
  • 霍夫变换
  • 离群值过滤
  • 最小二乘拟合
  • 直线绘制
  • 视频流读写
  • 总结


最近开始接触车道线相关的工作,由于本人之前在这一块没有什么经验,所以找了一个基础版本用python做了一下实现,现在把简单的流程进行一下梳理,分享给大家!

OpenCV的安装

笔者是开始做车道线之后才真正把OpenCV用起来,这里从OpenCV的安装开始讲起:

pip install opencv-python

图片的读取,展示和保存

对于图片的操作,OpenCV有很多现成的函数可以用,非常方便,这也为我们的快速实现提供了条件。
这里把图片的读取,展示和保存的代码列在这里:

  • 导入OpenCV
    import cv2
    
  • 读取图片,第一个参数为读取的图片名称,第二个是读取的格式,这里是灰度图的格式
    img = cv2.imread('img.jpg', cv2.IMREAD_GRAYSCALE)
    
  • 展示图片,第一个参数为展示框的名称,第二个参数是要展示的图片
    cv2.show('image', img)
    
  • 注意:这里要展示的图片框会直接闪过,要保留图片框的话需要加以下代码:
    cv2.waitKey(1000)
    
    上面的参数1000为弹出框等待1000ms之后推出,如果要一直等待,可以改为0;如果要以其他速度播放图片流,则可以通过修改这个参数实现,比如:10即为10ms,也就是100fps的速度播放。
  • 图片保存,第一个参数为保存的文件名,第二个参数为要保存的图片
    cv2.imwrite('img_gray.jpg', img)
    
    注意:上面要保存的文件名后缀要是图片格式的扩展名,jpg为压缩格式,bmp为位图格式。

Canny边缘检测

  • 算法简介
  • 梯度->亮度变化速度->边缘

自动驾驶感知-车道线系列(一)——车道线基础流程实现_第1张图片

自动驾驶感知-车道线系列(一)——车道线基础流程实现_第2张图片

  • 上阈值和下阈值
    自动驾驶感知-车道线系列(一)——车道线基础流程实现_第3张图片
    为了去除噪点,Canny检测设计了上阈值与下阈值,高于maxVal的检测点必保留,低于minVal的检测点必删除,在二值之间的如果和保留的检测点有连接的要保留,无连接的删除。
    代码如下:
    edge_img = cv2.Canny(img, 50, 100)
    

ROI_Mask

这一部分,是在原有图片的基础上,设置一部分感兴趣区域。做这部分操作,一方面是为了滤除车道线之外的噪点区域,一方面为了降低计算量。
先用OpenCV的fillPoly函数给定一个区域(该函数给定四个角点,即可以将该区域用1覆盖)

import numpy as np
mask = np.zeros_like(edge_img)
mask = cv2.fillPoly(mask, np.array([[[0, 368], [240, 210], [300, 210], [640, 368]]]), color=255)
masked_edge_img = cv2.bitwise_and(edge_img, mask)

自动驾驶感知-车道线系列(一)——车道线基础流程实现_第4张图片

霍夫变换

lines = cv2.HoughLinesP(edge_imgm, 1, np.pi/180, 15, minLineLength=40, maxLineGap=20)

离群值过滤

经过霍夫变换处理得到的直线有很多,一条粗线可能变换成多条线。
这一步就是根据斜率,剔除与均值距离较大的线。

最小二乘拟合

这里用到了几个函数,先列在这里,后面再慢慢详细介绍:

np.ravel       // 将高维数组拉成一维
np.polyfit     // 多项式拟合
np.polyval     // 多项式求值

举个例子

poly = np.polyfit([0,3,6,9], [0,5,9,14], deg=1)

直线绘制

cv2.line(img, (10,10), (200,100), 255, 3)
left_line = least_squares_fit(left_lines)
right_line = least_squares_fit(right_lines)
img = cv2.imread('img.jpg', cv2.IMREAD_COLOR)
cv2.line(img, tuple(left_line[0]), tuple(left_line[1]), color=(0,255,255), thickness=5)
cv2.line(img, tuple(right_line [0]), tuple(right_line [1]), color=(0,255,255), thickness=5)

视频流读写

capture = cv2.VideoCapture('video.mp4')
// 也可以读取摄像头
// capture = cv2.VideoCapture(0)
while True:
	ret, frame = capture.read()
	frame = show_lane(frame)
	cv2.imshow('frame', frame)
	cv2.waitKey(10)

总结

以上是一个简单的车道线入门级知识梳理,很多内容还有待细化,我会持续学习以上相关知识,不断细化内容。

你可能感兴趣的:(python,opencv,计算机视觉,自动驾驶)