Rotdetektion

Aus toolbox_interaktion
Version vom 5. November 2014, 22:23 Uhr von Bruenig (Diskussion | Beiträge)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Rotdetektion im EyesWeb

Rotdetektion

Der beschriebene Patch setzt eine Markierung in die Mitte einer satten roten Fläche eines Kamerabildes und zeigt beides in einem Bild an.

Nach dem Einlesen des Kamerabildes konvertieren wir das RGB-Bild in das HSV-Farbmodell, da uns die Farben und Sättigungen der Pixel interessieren und keine Rot-, Grün oder Blauanteile.

Zunächst mal ist eigentlich auch nur der Farbwert (unterer ast des patches) interessant, wir ziehen uns also aus dem HSV-Bild nur den Hue-Kanal, der als Grauwertbild dargestellt wird. Schwarz bedeutet, daß an der stelle im Originalbild ein rotes Pixel liegt. Weiß bedeutet lustigerweise fast das gleiche, nämlich ein minimal anderes rotes Pixel im Originalbild. Dazwischen (durch Grauwerte dargestellt) liegt das komplette Farbspektrum.

Folglich kann es bei roten Bereichen manchmal etwas komisch aussehen, da schwarze und weiße Pixel sich willkürlich zu mischen scheinen. In der Tat liegen sie vom Farbwert her sehr nah beieinander. An der Stelle bricht das Spektrum sozusagen um!

Glücklicherweise gestaltet sich die Rot-Detektion sehr einfach, da wir dafür nur einen Grenzwert nach unten hin brauchen. Uns interessieren also Farbwerte zwischen 0 und einem sinnvoll gewählten Schwellwert S in unserem Hue-Bild. Da wir aber später den roten Bereich binär mit dem Wert 1 dargestellt haben wollen, müssen wir das Bild mit einem logischen NOT invertieren.

Durch das Rauschen der Kamera und unsaubere andere Farben im Bild können vereinzelt kleine Bereiche auch als rot erkannt werden, was wir in dem Fall nicht wollen. Also lassen wir noch ein opening (morphological op) drüberlaufen, um solche Bereiche zu eliminieren.

Das Problem: Allein so läuft die Sache noch nicht, da z. b. dunklen Bereichen auch oft ein rot zugeordnet wird, das von unserem Schwellwert nicht abgeschnitten wird. Uns interessieren also neben dem Farbwert auch noch die Sättigungswerte der Pixel. Wir wollen ja nur satte rote Flächen erkennen. Das machen wir analog zur Farbfilterung nun im oberen Ast des Patches. Diesmal brauchen wir die Invertierung nicht, da satte Farben sowieso als weiß dargestellt werden.

Die für uns interessanten satten roten Pixel befinden sich nun überall dort, wo sowohl die Farben satt (oberer ast), als auch rot (unterer ast) sind. Folglich verknüpfen wir die entstandenen Binärbilder mit einer UND-Operation pixelweise. Wir erhalten so ein Binärbild, bei dem - wenn alles gut geht - nur die roten Bildbereiche als weiße Fläche dargestellt werden.

Da wir aber Koordinaten brauchen, berechnen wir mit dem Baricenter-Block den Schwerpunkt (man könnte umgangssprachlich auch Mittelpunkt sagen) der weißen Fläche bzw. unseres roten Bereichs im Originalbild.

Um "zitternde" Werte für die x- und y-Koordinaten des Schwerpunktes auszubügeln, werden sie über die Zeit gemittlet. Das geschieht in den folgenden Blöcken, indem wir die Matrix Splitten, die Werte einzeln glätten und dann wieder eine Matrix davon zusammenbaun, die wir zum Einzeichnen einer Markierung brauchen.

Zur Darstellung des Ergebnisses wird eine Markierung in das ursprüngliche Bild an der Stelle des geglätteten Schwerpunktes eingezeichnet und das ganze dann angezeigt.