Computersteuerung per Laser

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
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
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

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.
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

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.
BlackJack

Und die Differenz zwischen zwei Bildern sollte mit `numarray` oder `NumPy` auch in Python recht flott berechnet sein.
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
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.
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

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]
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?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

BalckJack hat doch schon gesagt, dass dies mit NumPy oder numarray zu bewerkstelligen sei.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Grossmeister_C
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.
BlackJack

Klar im Endeffekt schon, aber ob man das in einer optimierten C-Bibliothek oder in reinem Python macht, sollte schon einen Unterschied machen.
merlin_emrys
User
Beiträge: 110
Registriert: Freitag 3. März 2006, 09:47

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.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Vielleicht bietet dir auch schon die Python Imaging Library, was du brauchst. Und ziemlich schnell ist die meines Wissens auch.
Grossmeister_C
User
Beiträge: 36
Registriert: Montag 26. Februar 2007, 15:53

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.
Antworten