opencv 边缘平滑_基于OpenCV的车道检测实现(一)

本文详细介绍了如何基于OpenCV进行车道线检测,包括Canny边缘检测、ROI处理、霍夫变换、离群值过滤、最小二乘拟合和直线绘制等步骤。通过实例展示了从灰度化图片到最终检测车道线的过程,有助于理解无人驾驶中的路径规划技术。
摘要由CSDN通过智能技术生成

bf95e82647670c985a5c6979d4483000.png

无人驾驶的话题日趋起热,而车道线检测对于无人驾驶的路径规划来讲特别重要。要遵守交通规则,首先的要求便是对车道线检测,而且通过检测车道线可以进一步的检测地面指示标志、进行前碰撞预警策略设计等。

早早就对OpenCV感兴趣,但迟迟未去实践,现在我们就一起看看如何基于OpenCV进行检测吧!

步骤:

1、Canny边缘检测算法的实现

2、OPENCV ROI(感兴趣区域替换)

3、霍夫变换

4、离群值过滤

5、最小二乘拟合

6、直线绘制与整合

1、canny边缘检测算法

Opencv中的几种边缘检测算法_人工智能_k-CSDN博客​blog.csdn.net
d7cbe406c58fcae1ead54ac982708af6.png

首先,Canny 边缘检测是一种非常流行的边缘检测算法。忘记讲了,前面需要将图片灰度化,这样使得图片更好处理。

原图:

ab996fd9bc273faeffe334e43930e756.png

灰度之后:

520bfb15315e0286169baf9e5b3376f6.png
img=cv2.imread('img.jpg',cv2.IMREAD_GRAYSCALE)

接着进行边缘检测:

9cd56e40909769d9d8ac6513deb63cee.png
edge_img=cv2.Canny(img,100,150)

Canny边缘检测算法:

step1:用高斯滤波器平滑图象;

step2:用一阶偏导的有限差分来计算梯度的幅值和方向;

step3:对梯度幅值进行非极大值抑制;

step4:用双阈值算法检测和连接边缘。

Canny(名称,下阈值,上阈值)

a2dd9bd77eb80c0ff7ad966244ee26d2.png

主要利用梯度来看是否为边缘,上阈值以上的保留,下阈值以下的消去,中间的若与上阈值相连的则可留下,这样则可消去大量噪点。

2、roi去除背景

opencv ROI(感兴趣区域替换)​www.cnblogs.com

首先,要考虑原图以什么形式保存,这里采用的是利用掩码,产生一块对应的画布,进行替代。

640fa088d57b9a499b2a8116bef65fd0.png
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) 表示的。

5eb8cd0e980ffc8897fe287dd3ab2c21.png

例如,对极坐标系中的点 (8, 6)、(4, 9) 和 (12, 3),我们在霍夫空间中绘制出的相应图像如下:

b53037c86254ddcbb5dbf9d2720aa7ec.png

在霍夫空间中相交的曲线越多,意味着用交点表示的线对应的点越多。如此,我们便可在霍夫空间中定义了交点的最小阈值,以便检测车道线,消去无用的线。如果交点数量超过了定义的阈值,我们就确定一条对应参数 θ 和 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:
            break
    return lines
reject_abnormal_lines(left_lines,threshold=0.002)

通过以上三步,我们便可初步将车道线的位置确定下来。欢迎大家一起来尝试!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值