| « Obstacle Detection | Neues Fahrzeug Teil 2 » |
Vehicle Movement Tracking
Es gibt mal wieder etwas Neues. Nachdem die Kamera auf den Kyosho montiert war, konnte mit der Entwicklung des Algorithmus angefangen werden, der die optischen Flussinformationen in ein Tracking umsetzt. Von vornherein ist klar, dass ein Tracking durch den optischen Fluss nicht allein funktionieren kann. Dies hat folgende Gründe:
- Die Szene muss mehr oder weniger statisch sein. Falls die Szene nicht statisch ist, dürfen sich bewegende Elemente nicht zum Tracking verwendet werden. Sich bewegende Elemente können relativ leicht erkannt werden (der optische Fluss weicht hier von dem Rest der Szene ab), aber ein Herausrechnen dieser Elemente führt mindestens zu kleinen Fehlern.
- Bildrauschen der Kamera führt zu kleinen Fehlern.
- Bildelemente ohne Struktur führen bei der optischen Flussberechnung zum Fill-In-Effekt. Hier erben Bildelemente Flussvektoren von strukturierteren umgebenden Bildbereichen. Der Effekt hält einige Zeit an, auch wenn der Ursprung des optischen Flusses bereits völlig andere Werte angenommen hat. Die Flussvektoren dieser Elemente können herausgerechnet werden, je mehr Flussvektoren hier jedoch herausgerechnet werden, desto ungenauer wird der akkumulierte Gesamtfluss für Rotation und Geschwindigkeit.
- Fehler, die sich Bild für Bild einschleichen akkumulieren sich. Je länger das Tracking läuft, desto unpräziser wird es.
Der Algorithmus vollzieht Bild für Bild folgende Schritte:
- Schärfen (einfache Faltung mit einem Schärfungsfilter). Dies bewirkt, dass beim Verkleinern das resultierende Bild nicht nurnoch Matsch ist.
- Berechnung der mittleren Helligkeit des Gesamtbildes und Anhebung/Absenkung der Helligkeit auf den Mittelwert des Definitionsbereiches. Dieser Schritt verhindert, dass eine plötzliche Helligkeitsanpassung der Kamera zu Fehlern im Fluss führt. Dieser Effekt kann Rauschen verstärken (beim Anheben) oder vermindern (beim Absenken).
- Blockmittelung. Einzelne Pixel werden zu Blöcken zusammengefasst (hier 5x5 Pixel). Dieser Effekt vernichtet Details (leider) und Rauschen (juhu). Insgesamt kommt der Gesamtalgorithmus mit deutlich weniger Rechenzeit aus.
- Berechnung des optischen Flusses des gesamten Bildes auf Basis des aktuellen und des letzten Bildes. Der Algorithmus verwendet 5 Iterationen des Gauss Seidel Algorithmusses um den Fluss smooth zu halten und den Fill-In-Effekt zu mindern. Die letzte Schätzung des Flusses ist gleichzeitig Ausgangsbasis des Flusses des Folgebildes. Somit kann die Anzahl der Iterationen gering sein. Eigentlich wären viel mehr Iterationen erforderlich, nämlich halb so viele Iterationen wie das Bild Pixel breit ist. (Bei einem 320x240 Bild mit 5x5 Blöcken also 32 Iterationen).
- Klassifizierung der Flussvektoren in gut und schlecht. Ein guter Flussvektor ist einer, dessen Bildblock zu seinem Nachbarblock einen "sichtbaren" Helligkeitsunterschied aufweist. Dies wirkt dem Fill-In-Effekt nochmal entgegen.
- Betrachtung einer Teilmenge der guten Flussvektoren im oberen Bildbereich zur Bestimmung der Rotation. Exponentielle Glättung des resultierenden Vektors.
- Betrachtung einer Teilmenge der guten Flussvektoren im unteren Bildbereich zur Bestimmung der Geschwindigkeit. Exponentielle Glättung des resultierenden Vektors.
Die letzten beiden Schritte verwenden zur Stabilisierung eine Tiefenabschätzung jedes einzelnen Blocks. Die Tiefeneinschätzung wird durch Rückprojektion eines Blocks von einer 2D in eine 3D Koordinate erreicht. Dabei wird zunächst abgeschätzt wie viel "Boden" es vom Fahrzeugursprung bis zur Höhe des Blocks gibt. Das Verfahren ist schnell, leider aber auch schlecht. Zur Stabilisierung der letzten beiden Schritte ist es aber ausreichend. Und jetzt.....So sieht das ganze aus, wenns läuft. Eine Fahrt von meinem Büro ins Wohnzimmer, ein Wendemanöver und die Rückkehr ins Büro. Der Fahrweg beträgt etwa 22m. Das Tracking liefert hier eine Genauigkeit bis auf 30cm.
1 Kommentar
Ein Lob auch für die ansprechende Visualisierung.
Gruß und frohes Schaffen