Muszę wykryć pas drogowy z wideo. Oto mój sposób robienia tego.Python i OpenCV - Poprawa algorytmu wykrywania pasa ruchu
- Ustalanie obszaru zainteresowania (ROI) przez cięcie obrazu (Focus środkową część)
- Grayscale ROI
- wyrówna³o grayscaled ROI z
cv2.equalizeHist
- Zastosuj Gaussian blur do (3)
- progową (4) za pomocą
cv2.adaptiveThreshold
- szkieletować (5) za pomocą
skimage.morphology.skeletonize
- Zastosować
cv2.HoughLines
na (6)
Dla cv2.HoughLines
, założyłem więc, że:
- Jeśli
rho
jest dodatni (co oznacza, że linia prosta jest nachylona w prawo (bottom-up), to będzie narysuj linię tylko pod pewnymi kątami (ustawiłem zakres kąta)) - Jeśli
rho
jest ujemny (linia prosta jest nachylona w lewo (od dołu do góry), narysuje tylko linię, jeśli pod pewnymi kątami)
To jest mój kod do rysowania linii:
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))
Gdybym tego nie zrobił, co właśnie zrobiłem powyżej funkcji cv2.HoughLines
, wierzę, że będzie dużo niepotrzebnych liniami.
Po dostosowaniu parametrów i tak, mam całkiem dobry wynik, ale jest to tylko jedno zdjęcie. Nie sądzę, że będzie to dobre dla filmu, który będzie się ciągle zmieniać. Co przeszkadza mi najbardziej, to mój algorytm do rysowania potrzebnych linii (to jest drogi). Czy istnieje lepszy sposób? Co najmniej lepsze niż moje.
To jest mój wynik:
Równa histogram, progowaniu i szkiele- obraz ROI:
Jak mogę "zszyć" linie? Niestety, wciąż początkujący zarówno w programowaniu, jak i przetwarzaniu obrazów. – Hilman
Dodałem kilka notatek. Przepraszam, że nie podałem żadnego kodu. Jest w C++, a konkretna implementacja bardzo różni się od twojej - po prostu nie mam wystarczająco dużo czasu, aby dostosować ją do twojej aplikacji. – Aenimated1