我需要从视频中检测道路车道。以下是我的实现方式。
如果我没有为
对于参数的调整,我得到了一个相当不错的结果,但那只是针对一张图片。我认为对于一个将会不断变化的视频来说,效果不会那么好。 最困扰我的是关于我的算法来绘制所需的直线(即道路车道)。有更好的方法吗?至少比我的更好。
这是我的结果:
原始图像:
ROI的均衡化直方图、二值化和骨架化图像:
最终结果:
- 通过切图(将焦点放在中间部分)确定感兴趣区域(ROI)
- 对ROI进行灰度处理
- 使用
cv2.equalizeHist
均衡化灰度ROI - 对(3)应用高斯模糊
- 使用
cv2.adaptiveThreshold
阈值化(4) - 使用
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
函数执行上面的操作,我认为会有很多不必要的线条被画出来。对于参数的调整,我得到了一个相当不错的结果,但那只是针对一张图片。我认为对于一个将会不断变化的视频来说,效果不会那么好。 最困扰我的是关于我的算法来绘制所需的直线(即道路车道)。有更好的方法吗?至少比我的更好。
这是我的结果:
原始图像:
![The original image](https://istack.dev59.com/MLU0T.webp)
![Equalized Histogram, thresholded, and skeletonized](https://istack.dev59.com/5b59h.webp)
![Final result](https://istack.dev59.com/CdwKV.webp)