Ich muss Straße Spur von einem Video erkennen. Hier ist meine Art es zu tun.Python und OpenCV - Verbesserung meiner Spur Erkennung Algorithmus
- die Region of Interest Bestimmen (ROI) durch das Bild Slicing (Schwerpunkt des mittleren Teils)
- Graustufen des ROI
- Equalized die Graustufen ROI mit
cv2.equalizeHist
- Nehmen Gaußsche Unschärfe (3)
- Threshold (4) durch
cv2.adaptiveThreshold
- skeletonize (5) unter Verwendung von
skimage.morphology.skeletonize
Verwendung - Nehmen, um die 012.on (6)
Für die cv2.HoughLines
, habe ich, so dass:
- Wenn
rho
positiv ist (was bedeutet, dass die gerade Linie auf der rechten Seite (von unten nach oben) geneigt ist, wird es Zeichnen Sie nur die Linie, wenn es in bestimmten Winkeln ist (Ich habe den Bereich des Winkels eingestellt)) - Wenn
rho
negativ ist (gerade Linie ist nach links geneigt (von unten nach oben), wird es nur die Linie zeichnen, wenn es ist in bestimmten Winkeln)
Dies ist mein Code, um die Linien zu zeichnen:
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))
Wenn ich es nicht tun, was ich für die cv2.HoughLines
Funktion tat oben nur, ich glaube, es wird gezeichnet viele unnötige Linien sein.
Nach dem Einstellen der Parameter und so, habe ich ein ziemlich gutes Ergebnis, aber das ist nur für ein Bild. Ich denke nicht, dass es für ein Video, das sich ständig ändert, so gut ist. Was mich am meisten stört, ist mein Algorithmus zum Zeichnen der benötigten Linien (das ist die Fahrbahn). Gibt es einen besseren Weg? Zumindest besser als meiner.
Das ist mein Ergebnis:
Equalized Histogramm, Schwellwertbildung und skelettierten Bild des ROI:
Wie kann ich nähen "die Linien? Entschuldigung, immer noch ein Anfänger sowohl in der Programmierung als auch in der Bildverarbeitung. – Hilman
Ich habe ein paar Notizen hinzugefügt. Entschuldigung, dass Sie keinen Code zur Verfügung gestellt haben. Es ist in C++ und die spezielle Implementierung unterscheidet sich sehr von Ihrer - im Grunde habe ich einfach nicht genug Zeit, um es für Ihre Anwendung anzupassen. – Aenimated1