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为负(直线向左
cv2.equalizeHist
cv2。自适应阈值
skiliage.形态学.Skeletonize
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++的,具体的实现与你的不同,基本上,我没有足够的时间来适应你的应用程序。