Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python和OpenCV-改进我的车道检测算法_Python_Algorithm_Opencv_Image Processing_Hough Transform - Fatal编程技术网

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

Python和OpenCV-改进我的车道检测算法,python,algorithm,opencv,image-processing,hough-transform,Python,Algorithm,Opencv,Image Processing,Hough Transform,我需要从视频中检测公路车道。这是我的方法 通过切片图像(聚焦中间部分)确定感兴趣区域(ROI) 灰度化ROI 使用cv2.equalizeHist 将高斯模糊应用于(3) 阈值(4)通过使用cv2。自适应阈值 骨骼化(5)使用skiliage.形态学.Skeletonize 在(6)上应用cv2.HoughLines 对于cv2.HoughLines,我设置为: 如果rho为正(这意味着直线向右倾斜(自底向上),则仅当其处于特定角度时才会绘制直线(我设置了角度的范围)) 如果rho为负(直线向左

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

  • 通过切片图像(聚焦中间部分)确定感兴趣区域(ROI)
  • 灰度化ROI
  • 使用
    cv2.equalizeHist
  • 将高斯模糊应用于(3)
  • 阈值(4)通过使用
    cv2。自适应阈值
  • 骨骼化(5)使用
    skiliage.形态学.Skeletonize
  • 在(6)上应用
    cv2.HoughLines
  • 对于
    cv2.HoughLines
    ,我设置为:

  • 如果
    rho
    为正(这意味着直线向右倾斜(自底向上),则仅当其处于特定角度时才会绘制直线(我设置了角度的范围))
  • 如果
    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))
    
    lines=cv2.HoughLines(图1,np.pi/180,50)
    尝试:
    范围=线。形状[0]
    除属性错误外:
    范围=0
    对于X范围内的i(范围):
    对于ρ,θ在[i]行中:
    如果rho>0和(np.pi*1/10
    如果我没有像上面为
    cv2.HoughLines
    函数所做的那样,我相信会画出很多不需要的线

    在调整了参数等之后,我得到了一个相当好的结果,但这只是一张图片。我不认为这将是一个好的视频,将不断变化。 最让我烦恼的是我绘制所需线条(即道路车道)的算法。还有更好的办法吗?至少比我的好

    这是我的结果:

    原始图像:

    ROI的均衡直方图、阈值化和骨架化图像:

    最终结果:

    我建议您考虑在应用程序中使用概率霍夫线变换。在OpenCV的Python API中,它是在函数中实现的,
    cv2.HoughLinesP
    。这将实际为您提供线段,因此您无需计算端点。它也比标准的Hough线变换快得多

    但也有一些权衡。例如,可能需要添加逻辑以将线段缝合在一起。另一方面,我发现这并不是一件坏事。我的一个玩具项目(自动驾驶微型巴士)使用了这种方法,并且有单独的线段缝合在一起,这使得处理标准hough线变换根本不会给你任何线的弯曲道路变得更容易

    希望有帮助

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


    我所说的“缝合”并不是指任何特别复杂的东西,但我不知道有任何特定的OpenCV函数可以实现它。我只需要一种关联线段的方法,这些线段是同一车道的一部分。因此,我处理了从图像顶部向下运行的
    HoughLinesP
    返回的线段,并使用每个线段的斜率和y截距来确定线段相交的位置。

    如何“缝合”这些线?对不起,我还是一个编程和图像处理的初学者。我添加了一些注释。很抱歉没有提供任何代码。它是C++的,具体的实现与你的不同,基本上,我没有足够的时间来适应你的应用程序。