【发布时间】:2016-08-04 13:53:03
【问题描述】:
我需要从视频中检测道路车道。这是我的做法。
- 通过对图像进行切片来确定感兴趣区域 (ROI)(聚焦中间部分)
- 对 ROI 进行灰度化
- 用
cv2.equalizeHist均衡灰度ROI - 对 (3) 应用高斯模糊
- 阈值 (4) 使用
cv2.adaptiveThreshold - 使用
skimage.morphology.skeletonize骨架化 (5) - 在 (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))
如果我不做我刚才对cv2.HoughLines函数所做的事情,我相信会画出很多不需要的线条。
在调整参数等之后,我得到了一个相当不错的结果,但那只是一张图片。我认为这对于不断变化的视频来说不会那么好。 最困扰我的是我绘制所需线条(即道路车道)的算法。有没有更好的办法?至少比我的好。
这是我的结果:
【问题讨论】:
标签: python algorithm opencv image-processing hough-transform