我正在尝试开发一个可以检测道路上的车道的程序。我已经对霍夫线变换和概率霍夫线变换进行了实验。但是这些都没有得到我想要的结果。
原始图片:
霍夫线变换
概率霍夫线变换
似乎对于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的工作非常出色。但是,我认为您遗漏了至关重要的细节。作者写道:
// 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/