我正在尝试开发一个可以检测道路上的车道的程序。我已经对霍夫线变换和概率霍夫线变换进行了实验。但是这些都没有得到我想要的结果。

原始图片:

python - 道路车道检测程序无法正确检测车道-LMLPHP

霍夫线变换

python - 道路车道检测程序无法正确检测车道-LMLPHP
python - 道路车道检测程序无法正确检测车道-LMLPHP

概率霍夫线变换

python - 道路车道检测程序无法正确检测车道-LMLPHP
python - 道路车道检测程序无法正确检测车道-LMLPHP

似乎对于Hough Line Transform,我至少可以检测到整个车道,但是不幸的是,这条线一直无限延伸(直到它们移出图片为止),直到线彼此相交,这并不是良好的图形车道检测标记。

我还尝试了Probalistic Hough Line Transform,用于车道检测的绿线不会像另一条线一样无限延伸,但是无法标记和检测整个车道。

我正在尝试在这里复制结果(通过用Python编写)

http://www.transistor.io/revisiting-lane-detection-using-opencv.html

我该怎么做才能解决此问题?

码:

import numpy as np
import cv2
from matplotlib import pyplot as plt
from PIL import Image
import imutils

def invert_img(img):
    img = (255-img)
    return img

def canny(imgray):
    imgray = cv2.GaussianBlur(imgray, (5,5), 200)
    canny_low = 5
    canny_high = 150

    thresh = cv2.Canny(imgray,canny_low,canny_high)
    return thresh

def filtering(imgray):
    thresh = canny(imgray)

    minLineLength = 1
    maxLineGap = 1


    lines = cv2.HoughLines(thresh,1,np.pi/180,0)
    #lines = cv2.HoughLinesP(thresh,2,np.pi/180,100,minLineLength,maxLineGap)
    print lines.shape

    # Code for HoughLinesP
    '''
    for i in range(0,lines.shape[0]):
        for x1,y1,x2,y2 in lines[i]:
            cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)
    '''

    # Code for HoughLines

    for i in range(0,5):
        for rho,theta in lines[i]:
            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(img,(x1,y1),(x2,y2),(0,0,255),2)


    return thresh


img = cv2.imread('images/road_0.bmp')


imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

img = imutils.resize(img, height = 500)
imgray = imutils.resize(imgray, height = 500)

thresh = filtering(imgray)

cv2.imshow('original', img)
cv2.imshow('result', thresh)
cv2.waitKey(0)

最佳答案

很酷的话题!首先,为什么要添加高斯模糊?您的原始文章根本没有提及。如果删除它,我会立即得到额外的疯狂线条,可以使用canny_low和canny_high调低这些线条。我能找到的最好的大概是低= 100和高= 180。

python - 道路车道检测程序无法正确检测车道-LMLPHP

其次,将本文翻译成Python的工作非常出色。但是,我认为您遗漏了至关重要的细节。作者写道:

// Canny algorithm
Mat contours;
Canny(image,contours,50,350);
Mat contoursInv;
threshold(contours,contoursInv,128,255,THRESH_BINARY_INV);

您实现了Canny函数(cv2.canny()),但没有调用阈值函数。根据documentation I found,此函数“将固定级别的阈值应用于每个数组元素”。我尝试了您的代码,并提出了以下建议。
#thresh = canny(imgray) # original
edges = canny(imgray) # docs refer to return value as "edges"

retval, dst = cv2.threshold(edges, 128, 255,cv2.THRESH_BINARY_INV)

返回了两个值-retval现在对我们而言并不特别重要。 dst是阈值化后的图像数据的目标2D数组。然后,您将更新对cv2.HoughLines和cv2.HoughLinesP的调用,将“thresh”替换为“dst”。当我这样做时,我得到了很多有趣的行为,尽管我无法找到正确的调整值来使线条正常工作。

因此,希望可以为您提供一些指导。尝试我的技巧,并再阅读一两次,以再次检查您与作者具有相同的程序流程。这似乎是一个有趣的项目,玩得开心!

关于python - 道路车道检测程序无法正确检测车道,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34573584/

10-09 13:21