Freie Software für 3D Webcam wird bei [Be]LUG entwickelt

files/photos/sfd2011/Klinke-Grafitti.jpg

Der Mensch hat ja zwei Augen zur räumlichen Wahrnehmung seiner Umgebung. Es sollte also kein Problem sein, mit zwei handelsüblichen Webcams und ein wenig dazu passender Software, einen 3D-Effekt selbst zu erzeugen. Ganz so einfach war es dann doch nicht.

Man braucht jedoch keinen Hochleistungscomputer und teure Spezialsoftware um diese Effekte zu erreichen: Ein normaler Rechner mit dem Betriebssystem GNU/Linux reicht dafür vollkommen aus: Das ist Linux zum Hinsehen! Auch wenn man zum genießen der 3D-Bilder noch eine spezielle Brille benötigt.

Die Entwicklung der Software und das Experimentieren mit dreidimensionalen Bildern macht Spaß: Wer mehr Informationen zum Thema haben möchte findet die Projektseite zu unserer 3D Webcam im Wiki der Be[LUG] http://wiki.belug.de/wiki/3D-Webcam

Wer sich den aktuellen Stand unserer Entwicklung in 3D ansehen möchte kann jederzeit zu einem unserer Treffen kommen, die Termine finden sich hier. Fred Brockstedt als Projektleiter 3D-Webcam ist unter fred.brockstedt@belug.de zu erreichen.

Programmcode

#!/usr/bin/env python 
# -*- encoding: utf-8 -*-
import cv

# variables
WIDTH  = 640
HEIGHT = 480
#TYPE   = cv.CV_8SC3
TYPE   = cv.CV_MAKETYPE(8, 3)
STEP   = 1920

lcam = cv.CaptureFromCAM(1)
rcam = cv.CaptureFromCAM(2)

cv.SetCaptureProperty(lcam, cv.CV_CAP_PROP_FRAME_WIDTH, WIDTH)
cv.SetCaptureProperty(rcam, cv.CV_CAP_PROP_FRAME_WIDTH, WIDTH)

cv.SetCaptureProperty(lcam, cv.CV_CAP_PROP_FRAME_HEIGHT, HEIGHT)
cv.SetCaptureProperty(rcam, cv.CV_CAP_PROP_FRAME_HEIGHT, HEIGHT)

taste = 0

# 8 bit 3 Kanal Gruentransformatrionsmatrix
rmat  = cv.CreateMat(HEIGHT, WIDTH, TYPE) 
    
for i in range(HEIGHT):
    for k in range(WIDTH):
        rmat[i, k] = (0, 0, 1)

# 8 bit 3 Kanal Rot-Blau Transformationsmatrix 
gbmat  = cv.CreateMat(HEIGHT, WIDTH, TYPE) 
    
for i in range(HEIGHT):
    for k in range(WIDTH):
        gbmat[i, k] = (1, 1, 0)

# Outputmatrix
omat  = cv.CreateMat(HEIGHT, WIDTH, TYPE) 
    
for i in range(HEIGHT):
    for k in range(WIDTH):
        omat[i, k] = (0, 0, 0)

# main loop
while taste <> ord("q"):
    # Solange nicht die Taste "q" gedrueckt wurde Bilder
    # erneuern
    
    lbild = cv.QueryFrame(lcam) # linkes Bild einlesen
    matl  = cv.GetMat(lbild)
    rbild = cv.QueryFrame(rcam) # rechtes Bild einlesen
    matr  = cv.GetMat(rbild)

    ### Gruenkanal aus rechter Kamera auslesen
    cv.Mul(rmat, matr, matr)

    ### rot blau aus linker Kamera
    cv.Mul(gbmat, matl, matl)

    ### Bilder summanfuegen
    cv.Add(matl, matr, omat)
    

    cv.ShowImage("3D", omat)
    taste = cv.WaitKey(2)