Seite 1 von 1

Computersteuerung per Laser

Verfasst: Montag 5. März 2007, 17:30
von lordmyder
Hallo,
ich bin neulich im Internet auf flogendes Video gestoßen:
http://graffitiresearchlab.com/?page_id=76#video
Für die, die es sich nicht angucken wollen:
Mit einem Beamer wird auf einer Häuserfront projeziert. Mit einem Laser wird auf die Häuserwand gestrahlt. Eine Webcam erkennt den Laserpunkt und lässt an der Stelle vom Beamer einen Punkt anzeigen. Resultat:
Man kann auf der Front "malen".
Ich wollte nun etwas ähnliches probieren. Ich richte eine Webcam auf eine Wand, und registriere Laserbewegungen, um dann mit meinem Beamer Zeichnungen auf die Wand malen zu können. Mit dieser Technik liese sich auch an das ausführen von Funktionen per Laser-Aktivierung sprechen uvm.
So und jetzt zu meinem Problem=):
Ich weiß nicht so wirklich wie ich das umsetze. Ich wollte mit der Python-Webcam -Schnittstelle so schnell wie es geht Bilder aufnehmen, diese Pixel für Pixel durchgehen, und sobald ich einen bestimmten Farbton finde eine Funktion ausführen. Ich glaube aber, dass das jede zur Zeit verfügbare CPU schrottet=).
Kann mir jemand sagen, ob man das dennoch so macht, oder nicht. Und wenn nicht, wie man dieses Problem dennoch lösen könnte.
Ich bedanke mich schon mal, dass ihr das alles durchgelesen habt, und würde mich freuen, wenn mir jemand antwortet.
Gruß
LordMyder

Verfasst: Montag 5. März 2007, 17:49
von Dill
Hi,

das ist ne nette sache die die da gemacht haben.

afaik ist das tool open source, das einfachste wäre sich einfach anzuschauen wie die das machen.

falls dir das zu langweilig ist, hier eine idee wie man das machen könnte:

wenn du die einzelnen bilder als bitmap gespeichert hast kannst du die differnz zwischen den bitmaps berechnen. falls sich sonst nichts an der szene ändert, sind die in der differenz aktiven pixel der laser pointer.

Verfasst: Montag 5. März 2007, 17:57
von Nirven
Für die Veränderungen könnte man noch eine Schwellenwert einbauen, um Rauschen zu unterdrücken, und die Ergebnisse dann auf den korrekten Farbton untersuchen.

Ich denke die Ergebnisse wären damit schon halbwegs brauchbar (in definierter Umgebung, in freier Natur würde ich es nicht probieren). Wie rechenintensiv das dann ist weiß ich allerdings nicht... hängt auch von den FPS ab.

Verfasst: Montag 5. März 2007, 18:35
von BlackJack
Und die Differenz zwischen zwei Bildern sollte mit `numarray` oder `NumPy` auch in Python recht flott berechnet sein.

Verfasst: Montag 5. März 2007, 19:14
von lordmyder
Ich denke es könnte problematisch werden wenn ich einfach die Differenz der beiden BIlder bilde, denn erstens muss ich dann eine wirklich äußerst stabile Umgebung schaffen, und ich denke selbst in meinem Zimmer würde ich das nicht schaffen.(Licht etc). Zweitens weiß ich dann doch nicht, wo sich was geändert hat, kann also nicht irgendwelche Operationen auf die Laser basierend starten.
Mit c++ kenn ich mich leider überhaupt nicht aus, deshalb sagt mir der original Quellcode nicht viel.
Danke schonma für die Vorschläge, vielleicht hat ja noch jemand ne andere Idee..
Gruß
LordMyder

Verfasst: Montag 5. März 2007, 19:30
von BlackJack
Bewegungserkennung wird aber unter anderem mit Differenzbildern gemacht. Die Schwankungen in der Umgebung muss man halt entsprechend rausfiltern.

Wenn der Laserpunkt rot ist, dann hilft es vielleicht nur den Rot-Kanal zu betrachten falls das Bild im RGB-Modus vorliegt.

Verfasst: Montag 5. März 2007, 20:01
von Dill
Ich denke es könnte problematisch werden wenn ich einfach die Differenz der beiden BIlder bilde, denn erstens muss ich dann eine wirklich äußerst stabile Umgebung schaffen, und ich denke selbst in meinem Zimmer würde ich das nicht schaffen.(Licht etc).
du brauchst keine besonders stabile umgebung.
du musst nur sicherstellen, dass der laserpointer die grösste änderung bewirkt. alles andere ist dann rauschen und wird ignoriert. (wie bj und nirven ja schon sagten)

Zweitens weiß ich dann doch nicht, wo sich was geändert hat, kann also nicht irgendwelche Operationen auf die Laser basierend starten.
doch, das weisst du: differenz = bitmap1 - bitmap2, differenz ist auch eine bitmap, in der nur die pixel aktiv sind die an der stelle sind auf die der laserpointer zeigt. diese pixel musst du jetzt in deinem resultatbild setzen und an den beamer schicken!




[/code]

Verfasst: Montag 5. März 2007, 20:50
von lordmyder
gibt es ne bestimmte funktion, oder ein modul, mit dem ich zwei bitmaps von einander abziehen kann? Weil ich würde diese differenz jetzt wieder dadurch bilden, dass ich jedes Pixel von dem entsprechenden gegenpixel abziehe, dass würde ja kapazitäten ziehen ohne ende..oder versteh ich das falsch?

Verfasst: Montag 5. März 2007, 21:10
von Leonidas
BalckJack hat doch schon gesagt, dass dies mit NumPy oder numarray zu bewerkstelligen sei.

Verfasst: Montag 5. März 2007, 21:11
von Grossmeister_C
Im Endeffekt muss doch eh Pixel für Pixel vorgegangen werden.

Schliesslich ist ein Bildvergleich ja immer ein Vergleich der einzelnen Farbwerte.

Verfasst: Montag 5. März 2007, 22:32
von BlackJack
Klar im Endeffekt schon, aber ob man das in einer optimierten C-Bibliothek oder in reinem Python macht, sollte schon einen Unterschied machen.

Verfasst: Dienstag 6. März 2007, 02:51
von merlin_emrys
lordmyder hat geschrieben:Zweitens weiß ich dann doch nicht, wo sich was geändert hat, kann also nicht irgendwelche Operationen auf die Laser basierend starten.
Im ersten Moment nicht - im zweiten schon, wenn die Bewegung hinreichend langsam im Vergleich zur Bildaufnahmefrequenz ist. Wenn Du also bereit bist, den Laserpunkt nur "langsam" zu bewegen (und die dafuer noetige ruhige Hand hast), weisst Du vom zweiten Moment an, dass der Laser noch irgendwo da sein muss, wo er eben gewesen ist. Dann musst Du nur noch Regionen des Gesamtbildes auswerten.

Vorstellbar waere fuer mich, beim "Anschalten" des Systems den Nutzer darum zu bitten, den Laser einen Moment ruhig zu halten, und dann ein Signal zu geben, wenn der Lichtpunkt gefunden wurde. Anschliessend werte man dann immer das Umfeld des vorherigen Fundortes aus - dessen Groesse haengt dann eben von der Leistungsfaehigkeit des Computers ab und gibt vor, wie langsam man "malen" muss. Und wenn der Lichtpunkt (durch ein Handzucken oder so) "verlorengegangen" ist, muss der Nutzer darauf hingewiesen werden und dann eben wieder auf das "okay, Lichtpunkt wiedergefunden" warten.

Verfasst: Dienstag 6. März 2007, 03:13
von Y0Gi
Vielleicht bietet dir auch schon die Python Imaging Library, was du brauchst. Und ziemlich schnell ist die meines Wissens auch.

Verfasst: Dienstag 6. März 2007, 09:15
von Grossmeister_C
BlackJack hat geschrieben:Klar im Endeffekt schon, aber ob man das in einer optimierten C-Bibliothek oder in reinem Python macht, sollte schon einen Unterschied machen.
Schon klar, ich hatte mich auch auf
lordmyder hat geschrieben:gibt es ne bestimmte funktion, oder ein modul, mit dem ich zwei bitmaps von einander abziehen kann? Weil ich würde diese differenz jetzt wieder dadurch bilden, dass ich jedes Pixel von dem entsprechenden gegenpixel abziehe, dass würde ja kapazitäten ziehen ohne ende..oder versteh ich das falsch?
bezogen. War nur zu blöd zum zitieren.