Python和OpenCV-改进我的车道检测算法

2024-05-15 21:29:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要从视频中检测出车道。这是我的方法。

  1. 通过切片图像确定感兴趣区域(ROI)(聚焦中间部分)
  2. 使投资回报率灰度化
  3. 使灰度ROI与cv2.equalizeHist相等
  4. 将高斯模糊应用于(3)
  5. 使用cv2.adaptiveThreshold的阈值(4)
  6. 使用skimage.morphology.skeletonize进行骨架化(5)
  7. 在(6)上应用cv2.HoughLines

对于cv2.HoughLines,我设置为:

  1. 如果rho是正的(这意味着直线向右倾斜(自下而上),它将只在它处于某个角度时(我设置了角度的范围)才绘制直线)
  2. 如果rho为负数(直线向左倾斜(自下而上),则只有在一定角度时才会绘制直线)

这是我画线的代码:

lines = cv2.HoughLines(image_bin, 1, np.pi/180, 50)
    try:
        range = lines.shape[0]
    except AttributeError:
        range = 0

    for i in xrange(range):
        for rho, theta in lines[i]:
            if rho > 0 and (np.pi*1/10 < theta < np.pi*4/10):
                a = np.cos(theta)
                b = np.sin(theta)
                x0 = a * rho
                y0 = b * rho
                x1 = int(x0 + 1000 * (-b))
                y1 = int(y0 + 1000 * (a))
                x2 = int(x0 - 1000 * (-b))
                y2 = int(y0 - 1000 * (a))

                cv2.line(roi, (x1, y1), (x2, y2), (0, 255, 0))

            if rho < 0 and (np.pi*7/10 < theta < np.pi*9/10):
                a = np.cos(theta)
                b = np.sin(theta)
                x0 = a * rho
                y0 = b * rho
                x1 = int(x0 + 1000 * (-b))
                y1 = int(y0 + 1000 * (a))
                x2 = int(x0 - 1000 * (-b))
                y2 = int(y0 - 1000 * (a))

                cv2.line(roi, (x1, y1), (x2, y2), (0, 255, 0))

如果我不做我刚才做的关于cv2.HoughLines函数的事情,我相信会画出很多不需要的线。

经过调整参数等,我得到了一个相当好的结果,但这只是一个图片。我不认为这对一个不断变化的视频有什么好处。 最困扰我的是我的算法绘制所需的线(即道路车道)。有更好的办法吗?至少比我的好。

这是我的结果:

原始图像: The original image

ROI的均衡直方图、阈值和骨架图像: Equalized Histogram, thresholded, and skeletonized

最终结果: Final result


Tags: 图像nppicv2直线intx1x2
1条回答
网友
1楼 · 发布于 2024-05-15 21:29:31

我建议在应用中考虑使用概率Hough线变换。在OpenCV的Python API中,它是在函数cv2.HoughLinesP中实现的。这实际上会给你线段,所以你不需要计算端点。它也比标准的Hough线变换快得多。

不过,也有一些折衷方案。例如,可能需要添加逻辑以将线段缝合在一起。另一方面,我发现这并不是什么坏事。我的一个玩具项目(一个自动驾驶的微型公共汽车)使用了这种方法,并且有单独的线段来缝合在一起,这样可以更容易地处理弯曲的道路,其中标准的hough线变换根本不会给你任何线。

希望能有所帮助。

编辑:关于线段“缝合”的细节,这取决于你想要完成什么。如果只想显示道路,并且对线段之间存在一些间隙感到满意,则可能不需要进行任何缝合-只需显示所有线段。在我的应用程序中,我需要确定车道的曲率,所以我做了一些缝合,以建立每条道路车道的模型,其中包括车道的平均坡度,该模型用作负责控制伺服机构相应移动车轮的模块的输入。

我所说的“缝合”并不意味着什么特别复杂的东西,但我不知道有什么特定的OpenCV函数可以完成它。我只需要一种关联线段的方法,这些线段是同一条车道的一部分。所以我处理了从图像顶部向下工作的HoughLinesP返回的线段,并使用每个线段的斜率和y截距来确定线段的相交位置。

相关问题 更多 >