任务:
一共要完成两项任务:
1. 在所提供的公路图片上检测出车道线并标记
2. 在所提供的公路视频上检测出车道线并标记
方案:
要检测出当前车道,就是要检测出左右两条车道直线。由于无人车一直保持在当前车道,那么无人车上的相机拍摄视频中,车道线的位置应该基本固定在某一个范围内:
如果我们手动把这部分ROI区域抠出来,就会排除大部分干扰。接下来检测直线肯定用霍夫变换,但ROI区域内的边缘直线信息还是很多,考虑到只有左右两条车道,一条斜率为正、一条斜率为负,可将所有的线分为两组,每组再通过均值或最小二乘法拟合的方式确定唯一一条线就可以完成检测。具体步骤如下:
1. 灰度化
2. 高斯模糊
3. Canny边缘检测
4. 不规则ROI区域截取
5. 霍夫直线检测
6. 车道计算
对于视频来说,只要能检测出一幅图,后面将图像合成一下即可。
图像预处理
灰度化和滤波操作是大部分图像处理的必要步骤。灰度化是因为不需要色彩信息,可以减少计算量。而滤波会削弱图像噪点,排除干扰信息。另外,边缘提取是基于图像梯度的,梯度对噪声很敏感,所以平滑操作必不可少。
这里我们用分模块来写,方便调用:
import cv2
import numpyasnp
# 高斯滤波核大小
blur_ksize= 5# Canny边缘检测高低阈值
canny_lth= 50canny_hth= 150def process_an_image(img):
#1. 灰度化、滤波和Canny
gray=cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
blur_gray= cv2.GaussianBlur(gray, (blur_ksize, blur_ksize), 1)
edges=cv2.Canny(blur_gray, canny_lth, canny_hth)if __name__ == "__main__":
img= cv2.imread('test_pictures/lane.jpg')
result=process_an_image(img)
cv2.imshow("lane", np.hstack((img, result)))
cv2.