我需要从视频中检测出车道。这是我的方法。
cv2.equalizeHist
相等cv2.adaptiveThreshold
的阈值(4)skimage.morphology.skeletonize
进行骨架化(5)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))
如果我不做我刚才做的关于cv2.HoughLines
函数的事情,我相信会画出很多不需要的线。
经过调整参数等,我得到了一个相当好的结果,但这只是一个图片。我不认为这对一个不断变化的视频有什么好处。 最困扰我的是我的算法绘制所需的线(即道路车道)。有更好的办法吗?至少比我的好。
这是我的结果:
我建议在应用中考虑使用概率Hough线变换。在OpenCV的Python API中,它是在函数
cv2.HoughLinesP
中实现的。这实际上会给你线段,所以你不需要计算端点。它也比标准的Hough线变换快得多。不过,也有一些折衷方案。例如,可能需要添加逻辑以将线段缝合在一起。另一方面,我发现这并不是什么坏事。我的一个玩具项目(一个自动驾驶的微型公共汽车)使用了这种方法,并且有单独的线段来缝合在一起,这样可以更容易地处理弯曲的道路,其中标准的hough线变换根本不会给你任何线。
希望能有所帮助。
编辑:关于线段“缝合”的细节,这取决于你想要完成什么。如果只想显示道路,并且对线段之间存在一些间隙感到满意,则可能不需要进行任何缝合-只需显示所有线段。在我的应用程序中,我需要确定车道的曲率,所以我做了一些缝合,以建立每条道路车道的模型,其中包括车道的平均坡度,该模型用作负责控制伺服机构相应移动车轮的模块的输入。
我所说的“缝合”并不意味着什么特别复杂的东西,但我不知道有什么特定的OpenCV函数可以完成它。我只需要一种关联线段的方法,这些线段是同一条车道的一部分。所以我处理了从图像顶部向下工作的
HoughLinesP
返回的线段,并使用每个线段的斜率和y截距来确定线段的相交位置。相关问题 更多 >
编程相关推荐