Donnerstag, 25. Februar 2016

Gesichtserkennung mit Python und OpenCV

Nach der Beschreibung wie OpenCV installiert werden kann, möchte ich am Beispiel Gesichtserkennung zeigen, wie man damit auf einfache Weise ein kleines Projekt umsetzten kann.
Für die Umsetzung ist bei OpenCV schon alles Notwendige dabei und man kann für ein eigenes Projekt direkt auf ein Beispiel aufbauen. Mein kleines Projekt basiert dabei auf dem Python Tutorial aus der OpenCV Dokumentation. Für weitere Informationen zum zu Grunde liegenden Algorithmus verweise ich auch auf diese, da dort alles sehr gut beschrieben ist und es den Rahmen dieses Blog Eintrages überschreiten würde.


Zielstellung

Mit diesem kleinen Beispiel möchte ich Gesichter im Videostream meiner Notebook Kamera detektierien und diese durch einen Rahmen kennzeichnen.
Das sicherlich Aufwendigste bei der Erkennung von Gesichtern ist das Training des Algorithmus. Dafür ist bei OpenCV ein Trainer für den Algortihmus enthalten. Dies muss man aber nicht selbst durchführen, da der daraus resultierende Classifier bereits enthalten ist. Dieser befindet sich nach der Installation von OpenCV unter 
/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml


Setup

Installation von OpenCV siehe: http://thefoxisthenewowl.blogspot.de/2016/02/opencv-31-linux-mint-173-cinnamon-64-bit.html


Umsetzung

Als Erstes wird ein Projektverzeichnis angelegt und der Classifierer in dieses kopiert.
cd ~
mkdir facedetect
cp /usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml facedetect/haarcascade_frontalface_default.xml

Jetzt wird das Python Skript angelegt. Für dieses Beispiel müssen die Module von OpenCV (cv2) und Numpy importiert werden. Für die Gesichtserkennung muss als erstes der trainierte Classifier geladen werden. Dieser wird in der Variable face_cascade gespeichert. Abweichend vom original Beispiel wird als Eingangsbild kein JPG genommen, sondern es die eingebaute Webcam. Diese wird mit cv2.VideoCapture geöffnet. Dabei werden die erkannten Videoquellen durchnummeriert, ich habe nur eine, daher wird die Quelle 0 verwendet.
import cv2
import numpy as np

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
webcam = cv2.VideoCapture(0)

Die weitere Verarbeitung erfolgt innerhalb einer while Schleife, welche durch STRG+C bzw. q beendet werden kann. Je Schleifendurchlauf muss zuerst das aktuelle Frame der webcam mittels der read() Methode eingelesen werden. Anschließend wird zur Reduzierung der Rechenzeit das Bild auf die halbe Größe reduziert, gespiegelt (optional) und in ein schwarz-weiß Bild umgewandelt.
while(True):
        ret, frame = webcam.read()
        frame = cv2.resize(frame, (0,0), fx=0.5, fy=0.5) 
        frame = cv2.flip(frame, 1)
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

Anschließend erfolgt die eigentliche Gesichtserkennung mit der Methode detectMultiScale(). Die Dokumentation dazu befindet sich hier: 
http://docs.opencv.org/2.4/modules/objdetect/doc/cascade_classification.html. Die Koordinaten der erkannten Gesichter werden in faces gespeichert. Mittels len(faces) wird die Anzahl der erkannten Gesichter ermittelt und zur Information ausgegeben.
faces = face_cascade.detectMultiScale(
        gray,
        scaleFactor=1.3,
        minNeighbors=5)

    print "{0} Gesicht(er) gefunden!".format(len(faces))

Im nächsten Schritt wird in einer for Schleife für jedes Gesicht ein Rechteck mit der Methode rectangle() gezeichnet und das Bild miitels imshow() angezeigt.
for (x, y, w, h) in faces:
        img = cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 255, 0), 2)       

    cv2.imshow("Gesicht(er) gefunden", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
         break       

Beim Beenden wird die verwendete Webcam und alle Fenster geschlossen.
webcam.release()
cv2.destroyAllWindows()
Powered by Pelican. Theme blueidea, inspired by the default theme.

Keine Kommentare:

Kommentar veröffentlichen