Im Rahmen eines Forschungsprojektes besteht der Bedarf, den aktuellen Zustand einer Lichtsignalanlage (LSA, umgangssprachlich auch als Ampel bezeichnet) automatisiert durch Videobilder zu erkennen und deren Signallaufzeiten zu messen.
Umsetzung
Ein entsprechender Algorithmus, der diese Aufgaben löst, wurde mit C++ unter Verwendung der freien Programmbibliothek OpenCV realisiert. Zur Objekterkennung der LSA wird ein Kaskaden Klassifikator verwendet, der anhand von positiven und negativen Beispielbildern ausschließlich für die Schaltphase „rot“ trainiert wurde. Eine LSA kann also nur im „roten“ Zustand erkannt werden. Analog könnte man auch einen Kaskaden Klassifikator für den „grünen“ Zustand trainieren und für die Detektion einer LSA verwenden, worauf aber wegen des steigenden Rechenaufwands bei der Objektsuche verzichtet wird.
Nach erfolgreicher Erkennung einer LSA wird der entsprechende Bildbereich durch ein rotes Rechteck markiert und ab sodann mit Hilfe der Framerate des Videostreams die Signallaufzeit bestimmt. Die Bestimmung der Schaltphasen „rot“ bzw. „grün“ erfolgt mit der roten bzw. grünen Farbschicht des RGB-Videobildes. Die Differenz zwischen diesen beiden Farbschichten ermöglicht eine Aussage über den Zustand der LSA.
Besondere Anforderungen
Da die Videobilder beispielsweise durch die Kamera eines Smartphones aufgezeichnet werden, kann es häufig zu leichten Kamerabewegungen kommen, wodurch sich die Lage des gesuchten Objektes im Videobild verändert. Außerdem kann die Sicht auf das gesuchte Objekt zeitweise unterbrochen sein.
Damit der Algorithmus auch robust gegenüber von Kamerabewegungen und kurzzeitigen Verdeckungen der LSA ist, wurde die sogenannte Block-Matching Methode verwendet. Dies ist allerdings auch wieder mit einem steigenden Rechenaufwand verbunden. Über die Anzahl der verwendeten Blöcke kann der Aufwand beeinflusst werden. Im nachfolgenden Beispiel werden 5×6 Blöcke verwendet.
Die roten Blöcke symbolisieren die Bildbereiche, die vom aktuellen Videoframe zum Zeitpunkt t ausgewählt werden, um sie im darauffolgenden Videoframe zum Zeitpunkt t+Δt wieder zu finden. Die grünen Blöcke markieren zum Zeitpunkt t die wiedergefundenen Bildbereiche, die im vorausgehenden Zeitpunkt t-Δt ausgewählt wurden (ehemals rote Rechtecke). Über jedem grünen Rechteck stehen die Verschiebungsvektoren (Δx,Δy) der jeweiligen Blöcke bezüglich ihrer ursprünglichen Position im Bild in schwarzer Schriftfarbe. Links oben mit hellblauer Schrift wird die Bewegung zwischen den beiden aufeinanderfolgenden Gesamtbildern angegeben. Diese ergibt sich aus dem Mittelwert der Einzelbewegungen, wobei Ausreißer zuvor ausgeschlossen werden müssen. Man geht hierbei davon aus, dass der Großteil des betrachteten Videobildes statisch ist und Veränderungen zwischen den aufeinanderfolgenden Bildern nur durch Kamerabewegungen entstehen, die sich auf das gesamte Bild gleichermaßen auswirken. Ausreißer entstehen dann in denjenigen Bildbereichen, wo sich Objekte bewegen (hier: gelber Lkw, Fußgänger). Die Schriftfarbe über einem grünen Rechteck ist – im Falle eines detektierten Ausreißers – grau gewählt.