PhisigmaMathematik, Informatik, Naturwissenschaft, Technik und der ganze Rest

Webcam mit Python nutzen

Die Pygame-Bibliothek bietet eine einfache Möglichkeit unter Python auf eine Webcam zuzugreifen. Allerdings werden nicht alle Kameras von der Pygame-Bibliothek unterstützt. Das Camera-Modul unterstützt im Moment nur Linux und die v4l2-Kameras. Das Modul ist expierimentell und kann sich daher noch in seiner Funktion ändern oder sogar, was wir nicht hoffen wollen, aus der Bibliothek wieder entfernt werden.

Das Beispiel

Als Beispiel für die grundlegende Funktion des Camera-Moduls dient ein einfaches Skript, dass kontinuerlich Bilder von einer Webcam holt und sie dann in einem Fenster darstellt, so dass der Eindruck eines Films entsteht.

# Benötigte Module
import pygame
import pygame.camera
from pygame.locals import *

Zuerst müssen die Funktionen der Pygame-Bibliothek und des Camera-Moduls der Pygame-Bibliothek importiert werden. Dazu kommen noch die Konstanten der Pygame-Bibliothek. Die werden später zur Auswertung der Tastaturkommandos verwendet.

# Initialisieren der Module
pygame.init()
pygame.camera.init()

Damit die Funktionen der Pygame-Bibliothek zur Verfügung stehen, müssen diese noch initialisert werden.

# Auflösung
size = (640,480)

Die Größe des Kamerabildes sollte mit der Größe des Anzeigefensters übereinstimmen. Daher wird hier die Größe als Liste in der Variablen size gespeichert.

# Liste der vorhandenen Webcams ermitteln
camlist = pygame.camera.list_cameras()

Da an einem Rechner mehrer Kameras angeschlossen werden können, muss man den Pfad zur Kamera kennen. Dieser könnte z.B. /dev/video0 lauten. Die Methode list_cameras() liefert eine Liste mit allen angeschlossen Video-Geräten zurück.

# wenn ein Kameragerät gefunden wurde ...
if camlist:
    # Erste Webcam auswählen
    camname = camlist[0]
    print("Kamera gefunden: " + camname)

Wenn also mindestens ein Video-Gerät angeschlossen ist - das muss keine Webcam sein, sondern kann auch ein anderes Gerät sein-, dann ist die Variable camlist eine Liste und das Skript kann mit der Ansprache der Kamera weitermachen. Der erste Eintrag aus der Liste wird als Kameraname verwendet und auch ausgegeben.

    # Kamera-Objekt erzeugen mit gewünschter Auflösung
    cam = pygame.camera.Camera(camname,size)
    # Kamera starten
    cam.start()

Jetzt wird es interessant. Mit der Methode Camera(Gerät,(Breite,Höhe)) wird ein Camera-Objekt erzeugt. Dazu muss der Pfad zur Kamera (camname) wie auch die Größe der Aufnahme (size) angegeben werden. Nachdem das Camera-Objekt erzeugt worden ist, wird die Kamera mit der Methode start() aktiv geschaltet.

    # Fenster zur Darstellung der Bilder erzeugen
    screen = pygame.display.set_mode(size,0)

Damit die Bilder aus der Webcam auch angeschaut werden können, brauchen wir noch ein Fenster mit der gleichen Größe wie die Kamera-Bilder.

    # Zähler für die Anzahl der gelesenen Bilder initialisieren
    i=0
    # Endlosschleife, abbrechen mit Esc
    run = True

Zur Vorbereitung der Schleife wird die Bildzählervariable i auf Null gesetzt. Die Variable run dient zur Steuerung der Schleife.

    while(run):
        # Zähler hochzählen und Bildnummer ausgeben
        i = i+1
        print("Foto " + str(i))
        # Bild von der Kamera auslesen
        image = cam.get_image()

Eine while-Schleife sorgt dafür, dass immer wieder neue Bilder aus der Kamera ausgelesen werden, solange die Kontrollvariable run “wahr” enthält.

Wir zählen den Bildzähler um eins hoch und geben die aktuelle Bildnummer aus. Dann wird das Bild mit der Methode get_image() geholt und in der Variablen image gespeichert.

        # Neues Bild in das Fenster einbinden und darstellen
        screen.blit(image,(0,0))
        pygame.display.flip()

Nun wird das Bild in das Anzeigefenster an der Position (0,0) eingeblendet und die Anzeige des Fensterinhalts wird aktualisiert.

        # Drücken der Taste Esc im Bildfenster beendet das Programm
        events = pygame.event.get()
        for e in events:
            if e.type == QUIT or (e.type == KEYDOWN and e.key == K_ESCAPE):
                # Schleife beenden
                run = False

Jetzt soll das Programm noch sauber beendet werden. Dazu werden die aufgelaufenen Events ausgelesen und untersucht. Wenn ein Event vom Typ “Beenden” oder vom Typ “Esc-Taste gedrückt” vorhanden ist, wird die Kontrollvariable run auf den Wert “falsch” gesetzt. Damit ist das Programm zu Ende, denn es gibt keinen neuen Schleifendurchlauf.

    # Kamera und Fenster schließen
    cam.stop()
    pygame.display.quit()

Nach der while-Schleife wird die Kamera gestoppt und alle offenen Fenster werden geschlossen.

else:
    # wenn kein Kameragerät gefunden wurde ...
    print("Keine Kamera gefunden")

Fehlen nur noch die Aktionen, wenn keine Kamera gefunden wurde. Kurz und schmerzlos wird mitgeteilt, dass keine Kamera gefunden wurde.

Das vollständige Skript

# -*- coding: utf-8 -*-
# ---------------------------------------------
# Bilder von der Webcam einlesen und darstellen
# ---------------------------------------------
# Benötigte Module
import pygame
import pygame.camera
from pygame.locals import *

# Initialisieren der Module
pygame.init()
pygame.camera.init()

# Auflösung
size = (640,480)

# Liste der vorhandenen Webcams ermitteln
camlist = pygame.camera.list_cameras()
# wenn ein Kameragerät gefunden wurde ...
if camlist:
    # Erste Webcam auswählen
    camname = camlist[0]
    print("Kamera gefunden: " + camname)

    # Kamera-Objekt erzeugen mit gewünschter Auflösung
    cam = pygame.camera.Camera(camname,size)
    # Kamera starten
    cam.start()

    # Fenster zur Darstellung der Bilder erzeugen
    screen = pygame.display.set_mode(size,0)
    # Zähler für die Anzahl der gelesenen Bilder initialisieren
    i=0
    # Endlosschleife, abbrechen mit Esc
    run = True
    while(run):
        # Zähler hochzählen und Bildnummer ausgeben
        i = i+1
        print("Foto " + str(i))
        # Bild von der Kamera auslesen
        image = cam.get_image()
        # Neues Bild in das Fenster einbinden und darstellen
        screen.blit(image,(0,0))
        pygame.display.flip()
  
        # Drücken der Taste Esc im Bildfenster beendet das Programm
        events = pygame.event.get()
        for e in events:
            if e.type == QUIT or (e.type == KEYDOWN and e.key == K_ESCAPE):
                # Schleife beenden
                run = False
                
    # Kamera und Fenster schließen
    cam.stop()
    pygame.display.quit()
else:
    # wenn kein Kameragerät gefunden wurde ...
    print("Keine Kamera gefunden")
DokuWiki