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
Computersteuerung per Laser
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.
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.
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.
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.
Und die Differenz zwischen zwei Bildern sollte mit `numarray` oder `NumPy` auch in Python recht flott berechnet sein.
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
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
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.
Wenn der Laserpunkt rot ist, dann hilft es vielleicht nur den Rot-Kanal zu betrachten falls das Bild im RGB-Modus vorliegt.
du brauchst keine besonders stabile umgebung.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 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)
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!Zweitens weiß ich dann doch nicht, wo sich was geändert hat, kann also nicht irgendwelche Operationen auf die Laser basierend starten.
[/code]
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?
-
- User
- Beiträge: 36
- Registriert: Montag 26. Februar 2007, 15:53
Im Endeffekt muss doch eh Pixel für Pixel vorgegangen werden.
Schliesslich ist ein Bildvergleich ja immer ein Vergleich der einzelnen Farbwerte.
Schliesslich ist ein Bildvergleich ja immer ein Vergleich der einzelnen Farbwerte.
Klar im Endeffekt schon, aber ob man das in einer optimierten C-Bibliothek oder in reinem Python macht, sollte schon einen Unterschied machen.
-
- User
- Beiträge: 110
- Registriert: Freitag 3. März 2006, 09:47
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.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.
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.
Vielleicht bietet dir auch schon die Python Imaging Library, was du brauchst. Und ziemlich schnell ist die meines Wissens auch.
-
- User
- Beiträge: 36
- Registriert: Montag 26. Februar 2007, 15:53
Schon klar, ich hatte mich auch aufBlackJack 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.
bezogen. War nur zu blöd zum zitieren.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?