Мне нужно будет определить дорожную полосу из видео. Вот мой способ сделать это.Python и OpenCV - Улучшение алгоритма обнаружения полосы движения
- Определить области интереса (ROI), нарезая изображение (фокус в средней части)
- Grayscale КОРОЛЬ
- сравняли оттенками серого ROI с
cv2.equalizeHist
- Применить Гауссово размывание (3)
- Порог (4) с помощью
cv2.adaptiveThreshold
- скелетируют (5) с помощью
skimage.morphology.skeletonize
- Применить
cv2.HoughLines
на (6)
Для 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
, я считаю, что будет много ненужных линий, нарисованных.
После настройки параметров и т. Д., Я получил неплохой результат, но это всего лишь одно изображение. Я не думаю, что это будет хорошо для видео, которое будет меняться. Что беспокоит меня больше всего о моем алгоритме для рисования необходимых линий (это дорожная полоса). Есть ли лучший способ? По крайней мере, лучше, чем у меня.
Это мой результат:
корректирующая гистограмма, порогами и каркасный образ ROI:
Как я могу «прошивать» линии? Извините, но все же новичок в программировании и обработке изображений. – Hilman
Я добавил несколько заметок. Извините за отсутствие кода. Это на C++, и конкретная реализация сильно отличается от вашей - в основном, у меня просто нет времени, чтобы адаптировать ее для вашего приложения. – Aenimated1