【问题标题】:How to eliminate obstacles on the lane for autonomous vehicle?自动驾驶汽车如何消除车道上的障碍物?
【发布时间】:2026-01-21 02:00:01
【问题描述】:

我从事自动驾驶汽车项目。我想确定汽车在高速公路上的转向角。但是对于这个特定的场景,没有车道线或任何车道边界,只有沥青本身。我假设周围环境不会包含任何与沥青颜色足够接近的颜色。

(假设中间没有白线,我看到的都是沥青)

这个过程是实时的(在 Raspberry Pi 上),帧是在相机的帮助下捕获的。

针对这个问题,我提出了如下管道(OpenCV 4.0 with C++):

  • 去噪 --> BGR2HSV --> HSV 过滤器 --> Canny 边缘检测 --> 裁剪到 ROI --> 霍夫线检测 --> 工艺线

这条管道清楚地告诉了我汽车应该如何转向以保持在单向车道的中间。我可以用 HSV 过滤沥青部分。问题是当车道上有障碍物时。可能会在车道的一侧或中间放置一些盒子。在这种情况下,HSV 过滤器会在车道上创建一个大黑框。霍夫线检测将框的边缘转换为假车道线。最终,这会导致错误的转向预测。实际上,我开发了一种算法来通过观察霍夫线的斜率来处理这个问题,但是它并不总是稳定的。

(放置在车道一侧的红色框)

我的意思是,您会建议对此过程进行任何改进以消除图像过滤中可能存在的障碍吗?车道上的障碍物会导致错误的霍夫线并影响转向决策。我认为的一个改进是从图像的左侧和右侧(在 ROI 中)检测最大白色像素计数的索引,然后将每个像素设置为白色。这将扫除道路中间的障碍物(车辆可能会撞到障碍物),但无论如何都会将障碍物留在车道的一侧。但是如果道路弯曲,这将不实用,因为改进会丢失图像中的弯曲数据。

(图片来源:https://www.masterbuilder.co.in/wp-content/uploads/2018/03/Rs-46000-cr-initiative-taken-for-new-express-highways-elevated-roads-Govt.png

编辑:

当我使用convexHull as in OpenCV documentation 时,我得到以下结果,这是出乎意料的。

【问题讨论】:

    标签: opencv image-processing


    【解决方案1】:

    应用 HSV 过滤器后,您可以使用 findContours 后跟 convexHull。这会弥合检测到的轮廓中的“间隙”。

    示例:

    代码:

    import cv2
    import numpy as np
    # load image in grayscale
    img = cv2.imread('hull.png',0)
    # load image in color
    img_color = cv2.imread('hull.png')
    # find contours
    contours, hier = cv2.findContours(img,cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    # get and draw convexhull
    for cnt in contours:
        hull = cv2.convexHull(cnt)
        cv2.drawContours(img_color,[hull],0,(0,0,255),3)
    # show images
    cv2.imshow('Image', img)
    cv2.imshow('Result', img_color)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    如需更实际的示例,请查看this answer。所描述的过程在那里应用:

    【讨论】:

    • 我检查了convexHull,并将它应用到了一个样本图上。你能检查一下主要问题@J.D.中的编辑吗? ?实际上结果并不令人满意。
    • 能否也包含输入图像?
    【解决方案2】:

    您可以尝试定位道路中间(不带或不带随机物体)并从那里计算转向角,而不是识别道路并尝试消除盒子等外部物体。

    这是一篇这样做的研究论文,它在车道存在时也有帮助,但在光线不足或阴影阻碍车道时不可见。

    https://www.researchgate.net/publication/282921028_Steering_angle_estimation_for_autonomous_vehicle_navigation_using_hough_and_Euclidean_transform

    【讨论】:

      【解决方案3】:

      特斯拉使用的一个技巧是,如果出于某种原因看不到车道,那就是跟随前车的运动。因此,您可以通过适当的算法利用它们,而不是消除障碍。

      你的算法应该是这样的:

      1. 尝试检测您正在前进的车道。
      2. 如果找到前车,则使用前车的运动跟踪算法跟踪前车。

      这篇文章很好地介绍了python中的对象跟踪:

      https://www.pyimagesearch.com/2018/07/30/opencv-object-tracking/

      如果您想了解有关自动驾驶汽车的更多信息,可以在此处查看我的 github 存储库:

      https://github.com/kochlisGit/autonomous-vehicles-deep-reinforcement-learning

      【讨论】: