Pythonstuff GLSL in English Pythonstuff GLSL auf Deutsch Pythonstuff GLSL Pythonstuff
PythonStuff Home
 

 

Echtzeit-Video von einer USB-Kamera zur Textur hinzufügen

Das ist etwas sehr Nettes, auch wenn es derzeit nur unter Windows funktioniert (aber ich arbeite an einer Linux-Version!).

Es ist eine kleine Erweiterung zu Beispiel 8 - Environmental Bump Mapping mit GLSL Cube Mapping.

Das Programm

Die Texturen die in dieser Demo verwendet werden sind hier:

  • Data20.zip File (Das Verzeichnis “data20” dorthin entpacken, wo auch “video_reflection.py” liegt)

Der Code benutzt die tolle Library VideoCapture.py von Markus Gritsch - für Windows.

Wenn Du ein ähnlich einfaches Python-Interface für Video4Linux kennst, baue ich das gerne ein. Da ich noch keines gefunden habe, lerne ich gerade den Umgang mit ctype und v4l.

Die Museums-Ansicht stammt von http://local.wasp.uwa.edu.au/~pbourke/miscellaneous/stereographics/stereopanoramic/, sie gehört Peter Murphy.

Und hier ist ein Video vom Ergebnis - mit einem sehr netten Hamster vor der Kamera:

Programm Beschreibung

Ein einfaches Demo-Programm um das Funktionieren der Libary zu überprüfen wäre

from VideoCapture import Device
cam = Device()
cam.saveSnapshot('image.jpg')

Drei Zeilen Code für einen Kamera-Schnappschuss samt Speichern auf der Platte - ist da nicht cool? Es gibt noch eine Menge Optionen und Funktionen um auftretende Spezialfälle zu behandeln, aber ein brauchbares Programm ist erstaunlich einfach zu machen:

Kamera Initialisierung

from VideoCapture import Device
try:
    cam = Device()
except:
    print "No Camera device found"
    cam = None

Frame Grabbing

Für jeden OpenGL-Frame den wir darstellen, überprüfen wir, ob von der USB Kamera ein neues Bild vorliegt. Wenn wir eines bekommen (so etwa 30-60 mal pro Sekunde, nicht synchron mit der OpenGL-Darstellung), tragen wir es auf die Cubemap-Textur auf - und zwar mit glTexSubImage2D(), damit wir nur die relevanten Teile der Textur zur Grafikkarte übertragen müssen:

if cam:                       # camera object was successfully initialized
    snap = cam.getImage()
    if snap:                  # a new image is ready from the camera
        snapstr = snap.tostring( "raw", 'RGBX')
        glTexSubImage2D( GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0,
                         0, 160,                        # position within the texture
                         snap.size[0], snap.size[1],    # size of the image
                         GL_RGBA, GL_UNSIGNED_BYTE,
                         snapstr )

Ziemlich einfach, wenn man's mal herausgefunden hat :-)

Der Rest des Programms basiert überwiegend auf dem vorherigen Beispiel, dort findest Du auch Infos zum Cube Mapping.

:!: Es ergeben sich endlose Möglichkeiten - man könnte das Bild der Kamera sogar mit PIL analysieren und das OpenGL Modell darauf reagieren lassen - wie wäre es mit einem Augenpaar, das nicht nur reflektiert, was es sieht sondern auch noch allen Deinen Bewegungen folgt ?


English version, Start
Impressum & Disclaimer