Inhaltsverzeichnis
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")