Pixel Clustering

Im Moment studiere ich mit meiner Schulklasse ein Theaterstück ein (,,Wie es euch gefällt“ von William Shakespeare), so dass ich während den Szenen, in denen ich nicht mitspiele viel Wartezeit habe, während der ich nichts zu tun habe. So kam ich zu folgendem Gedankenexperiment, dass ich noch am selben Tag in die Tat umgesetzt habe.

Ich habe mich gefragt, was wohl passiert, wenn man jeden Pixel eines Bildes als Punkt in einem fünfdimensionalen Raum ansieht. Dabei sind die ersten beiden Koordinaten die x- und y Koordinaten des Pixels im Bild selber und die letzten drei Koordinaten ergeben sich aus den RGB-Werten des Pixels. Ein Pixel an der Stelle x=7 und y = 23 mit der Farbe R=55, G=88, B = 180 hat ist also ein Punkt im fünfdimensionalen Raum: P(7|23|55|88|180).

Wenn man dann alle Pixel eines Bildes in Punkte umwandelt erhält man also Punktwolken im fünfdimensionalen Raum, die man mit einem einfachen Clusteringverfahren zusammenfassen kann. Wenn man das tut und die so als ,,zusammenhängend“ erkannten Pixel gleichfarbig einfärbt, so dachte ich mir, müssten doch ganz nette Bilder entstehen.

Nach der Umsetzung bestätigte sich das auch:

Ich habe die Bilder direkt von meiner Webcam genommen, leider ist an ein in Echtzeit berechneter Effekt  nicht umsetzbar, da es sehr lange dauert, bis der Clustering-Algorithmus bei so vielen Bildern sehr lange zum terminieren braucht. Wer an dem Programm interessiert ist, kann gerne mit mir in Kontakt treten. Es ist in Java geschrieben und dadurch einigermaßen plattformunabhängig.

Motion Tracking

Die letzten Tage habe ich Captain Tomates Catchup Games – Folge 3 bei Ehrensenf gesehen und dabei einen Link gefunden, der mich sehr beeindruckt hat. Leider bin ich kein glücklicher Besitzer einer Wii wie Herr Jhony Chung Lee und habe mir deshalb gedacht, dass  meine iSight zwar nicht eine so hohe Auflösung hat wie die Infrarotkamrea der Wii Remote, aber trotzdem genauso im Stande ist Infrarotlicht zu sehen. Die hardwarebeschleunigte Trackingfunktion in der Wii Remote, so dachte ich mir, kann ja auch nicht schwer nachzuahmen sein.

Da die Programmiersprache, die mir am meisten liegt Java ist, und ich an einem Mac arbeite, auf dem die JMF leider nur eingeschränkt lauffähig ist, habe ich die alten Klassen von meinem TicTacToe Projekt im Rahmen meiner 12 Klassarbeit mit denen ich dieses Problem mit Hilfe von Quicktime für Java umgangen hatte wieder herausgekramt und auf meine JVM losgelassen. Nach einigen Fehlstarts hatte ich auch ein Bild mit ordentlicher Framerate.

Um nun Trackingpunkte zu extrahieren, habe jeweils alle Pixel des einkommenden Bildes untersucht und sie, wenn ihre Helligkeit einen bestimmten Schwellwert überschreitet, zu einer Liste hinzugefügt. Auf die Pixel in der Liste habe ich dann ein Clusteringverfahren (eine leicht angepasste und speedoptimierte Version von hirachical clustering) angewendet um die Pixel zu Trackpoints zusammen zu fassen. Anschließen habe ich noch die Anzahl der in die Liste aufgenommenen Pixel auf ein Fünftel reduziert, indem ich nur die Pixel aufgenommen habe, die nicht komplett von hellen Pixeln umgeben sind, um die Performance zu erhöhen. Es werden dann nur die Randpixel eines hellen Punktes aufgenommen. Die Genauigkeit leidet so gut wie garnicht darunter.

Die erfassten Koordinaten der hellen Stelle können dann für beliebige Zwecke genutzt werden. Zum Beispiel um ein kleines Zeichenprogramm daraus zu basteln.

Unter dunkleren Lichtverhältnissen (am besten Abends) funktioniert es sogar erstaunlich gut mit einer kleinen LED Taschenlampe.

In Planung ist jetzt einen IR-Filter vor die Kamera zu kleben und mit einem IR-Pen zu arbeiten. Dann gehts auch bei hellerem Licht (hoffentlich). Mehrere Trackpoints zu erkennen funktioniert auch schon, habe ich aber noch nicht angewendet, da ich noch nicht das Problem gelöst habe die Trackpoints in jedem Bild wieder zu erkennen und zuzuordnen, so dass mehrere Trackpoints nicht verwechselt werden.