Diesen Sonnabend haben wir mit Python Bilder von der Webcam geholt und darin nach Gesichtern gesucht. Das hat erstaunlich gut funktioniert.

OpenCV ist eine freie Programmbibliothek mit Algorithmen für die Bild- und Videoverarbeitung. Sie stellt viele grundlegende Berechnungen und Analysen bereit. Die Bibliothek ist in der Programmiersprachen C programmiert, hat aber weitere Schnittstellen für die Sprachen C++, Python und Java. Vor allem die Python Schnittstelle macht die ersten Schritte sehr viel einfacher.

OpenCV für Python installieren

Um OpenCV benutzen zu können, müssen wir die Thonny Entwicklungsumgebung unten rechts wieder auf „Der selbe Interpreter der Thonny ausführt“ umstellen, dann im Menü bei Extras -> Verwalte Pakete die folgende Bibliothek installieren: opencv-python.

Leider geht die Video-Aufzeichnung im Moment nicht unter MacOS, weil sich die Zugriffsrechte auf die Kamera nicht so einfach für Python freischalten lassen 🙁 Aber unter Linux und Windows geht es wunderbar. Was in MacOS funktioniert ist, das Python-Programm im Terminal zu starten anstatt in Thonny.

Erste Bilder von der Kamera

Das erste Programm importiert die Pythonbibliothek cv2. Dann öffnen wir die erste Kamera am Computer. Leider gibt es in OpenCV keine Funktion, um sich eine Liste der verfügbaren Kameras geben zu lassen.

In der Endlos-Schleife lesen wir ein Bild von der Kamera. Falls dies erfolgreich war, geben wir das Bild mit cv2.imshow in dem Fenster „Kamera“ aus und warten bis man eine Taste drückt. Das Fenster „Kamera“ wird automatisch von OpenCV geöffnet.

import cv2

cam = cv2.VideoCapture(0)

while True:
    ret, img = cam.read()
    if ret == True:
        cv2.imshow("Kamera", img)

    cv2.waitKey(1)

Gesichter erkennen

Es gibt viele Ansätze, um Gesichter im Kamerabild zu finden. Eine Möglichkeit mit Künstlicher Intelligenz ist der Cascade Klassifizierer. Dieser wird mit vielen Fotos trainiert und das gelernte Modell kann dann später benutzt werden. Ein fertig gelerntes Modell gibt es zum Beispiel hier: Webcam Face Detect. Wir brauchen von dort eine Kopie der Datei haarcascade_frontalface_default.xml.

Das Programm startet wieder die Kamera, legt einen cascade Klassifizierer mit dem Modell aus der Datei an. In der Endlos-Schleife lesen wir ein Bild von der Kamera. Dieses wird mit cascade.detectMultiScale(...) an den Klassifizierer übergeben. Als Ergebnis liefert diese eine List von Rechtecken, z.B. [[550 216 279 279],[234 346 202 202]].

import cv2

cam = cv2.VideoCapture(0)

f = "haarcascade_frontalface_default.xml"
cascade = cv2.CascadeClassifier(f)

while True:
    ret, image = cam.read()
    if ret == False:
        continue

    rects = cascade.detectMultiScale(
        image,
        scaleFactor=1.1,
        minNeighbors=4,
        minSize=(100,100),
        maxSize=(400,400),
        flags=cv2.CASCADE_SCALE_IMAGE)
    print(rects)

    for r in rects:
        cv2.rectangle(
            image,
            (r[0], r[1]),
            (r[0]+r[2], r[1]+r[3]),
            (100,225,0), 2)
    cv2.imshow("camera", image)

    cv2.waitKey(1)

Die ersten beiden Zahlen sind die x und y Position der linken oberen Ecke des Rechtecks. Die anderen beiden Zahlen sind die Breite und Höhe. Mit cv2.rectangle(...) malen wir jedes Rechteck einzeln in das Bild hinein. Der erste Parameter ist das Bild, dann kommt x und y der linken oberen Ecke, dann x und y der rechten unteren Ecke. Der vorletzte Parameter ist die Farbe (Rot,Grün,Blau) und der letzte Parameter ist die Liniendicke in Bildpunkten.

Weiterführende Anleitungen

Kategorien: Digitaltechnik