无人驾驶的话题日趋起热,而车道线检测对于无人驾驶的路径规划来讲特别重要。要遵守交通规则,首先的要求便是对车道线检测,而且通过检测车道线可以进一步的检测地面指示标志、进行前碰撞预警策略设计等。
早早就对OpenCV感兴趣,但迟迟未去实践,现在我们就一起看看如何基于OpenCV进行检测吧!
步骤:
1、Canny边缘检测算法的实现
2、OPENCV ROI(感兴趣区域替换)
3、霍夫变换
4、离群值过滤
5、最小二乘拟合
6、直线绘制与整合
1、canny边缘检测算法
Opencv中的几种边缘检测算法_人工智能_k-CSDN博客blog.csdn.net首先,Canny 边缘检测是一种非常流行的边缘检测算法。忘记讲了,前面需要将图片灰度化,这样使得图片更好处理。
原图:
灰度之后:
img=cv2.imread('img.jpg',cv2.IMREAD_GRAYSCALE)
接着进行边缘检测:
edge_img=cv2.Canny(img,100,150)
Canny边缘检测算法:
step1:用高斯滤波器平滑图象;
step2:用一阶偏导的有限差分来计算梯度的幅值和方向;
step3:对梯度幅值进行非极大值抑制;
step4:用双阈值算法检测和连接边缘。
Canny(名称,下阈值,上阈值)
主要利用梯度来看是否为边缘,上阈值以上的保留,下阈值以下的消去,中间的若与上阈值相连的则可留下,这样则可消去大量噪点。
2、roi去除背景
opencv ROI(感兴趣区域替换)www.cnblogs.com首先,要考虑原图以什么形式保存,这里采用的是利用掩码,产生一块对应的画布,进行替代。
mask=np.zeros_like(edge_img)
mask=cv2.fillPoly(mask,np.array([[[20,488],[700,100],[130,200],[120,200]]]),color=255)
masked_edge_img=cv2.bitwise_and(edge_img,mask)
这里则需要确定画布的四个点的位置,color=255为黑色。
3、霍夫变换
霍夫变换www.cnblogs.com在直角坐标系中,我们可以通过绘制 y 对 x 的图像来表示 y=mx+b。但在霍夫空间中,我们也可以通过绘制 b 对 m 的图像将这条线表示为一个点,即用极坐标方程。
例如,直线方程 y=2x+1 在霍夫空间中可能是用 (2, 1) 表示的。
例如,对极坐标系中的点 (8, 6)、(4, 9) 和 (12, 3),我们在霍夫空间中绘制出的相应图像如下:
在霍夫空间中相交的曲线越多,意味着用交点表示的线对应的点越多。如此,我们便可在霍夫空间中定义了交点的最小阈值,以便检测车道线,消去无用的线。如果交点数量超过了定义的阈值,我们就确定一条对应参数 θ 和 r 的线。
left_lines=[line for line in lines if calculate_slope(line)>0]
right_lines=[line for line in lines if calculate_slope(line)<0]
def reject_abnormal_lines(lines,threshold):slopes=[calculate_slope(line) for line in lines]while len(lines)>0:mean=np.mean(slopes)diff=[abs(s-mean) for s in slopes]idx=np.argmax(diff)if diff[idx]>threshold:slopes.pop(idx)lines.pop(idx)else:breakreturn lines
reject_abnormal_lines(left_lines,threshold=0.002)
通过以上三步,我们便可初步将车道线的位置确定下来。欢迎大家一起来尝试!