
In diesem Beitrag möchte ich euch zeigen, wie ihr mit Python Gesichter in einem Bild erkennen könnt. Wir benötigen dafür die Bibliothek OpenCV (Open Source Computer Vision Library), die ihr über den Paketmanger installieren könnt.
OpenCV enthält bereits vortrainierte Modelle für die Erkennung diverser Objekte, so dass wir keinen Algorithmus selbst entwickeln müssen. Die Bibliothek mit den vortrainierten Datensätzen für die Gesichtserkennung nennt sich und wird in Zeile 6 eingebunden. OpenCV liefert diverse vortrainierte Modelle, wie z.B. Ober-/Unterkörper, Ganzkörper, Augen, Kennzeichen. Wir benötigen für unser Beispiel das Modell für Gesichter.
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
Im Anschluss wird das Bild gelesen und in Graustufen umgewandelt.
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
In Zeile 18 wird das Graustufenbild mit Hilfe des s auf Gesichter geprüft. Die Methode dafür heißt
faces = face_cascade.detectMultiScale(gray, 1.65, 3)
# Optional
faces = face_cascade.detectMultiScale(gray, 1.65, 3, minSize=(30,30))
Zeile 25 zeichnet dann ein Rechteck um jedes gefunden Gesicht. Ich habe die Zeile auskommentiert und meine eigenen Eckmarkierungen (Zeilen 26-34) programmiert.
face_detection.py
import cv2
image_path =('faces2.jpg')
# Load the Haar Cascade model
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# Read the image
image = cv2.imread(image_path)
if image is None:
print("Error: Could not find image!")
exit()
# Convert to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Detect faces
faces = face_cascade.detectMultiScale(gray, 1.65, 3)
line_color = (0, 255, 0)
line_thickness = 3
# Draw rectangles around faces
for (x, y, w, h) in faces:
#cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2) # rectangle
line_width = round(w//4) # 1/4 of total width
cv2.line(image, (x, y), (x+line_width, y), line_color, line_thickness) # top left
cv2.line(image, (x, y), (x, y+line_width), line_color, line_thickness) # top left
cv2.line(image, (x+w, y), (x+w-line_width, y), line_color, line_thickness) # top right
cv2.line(image, (x+w, y), (x+w, y+line_width), line_color, line_thickness) # top right
cv2.line(image, (x, y+h), (x, y+h-line_width), line_color, line_thickness) # bottom left
cv2.line(image, (x, y+h), (x+line_width, y+h), line_color, line_thickness) # bottom left
cv2.line(image, (x+w, y+h), (x+w-line_width, y+h), line_color, line_thickness) # bottom right
cv2.line(image, (x+w, y+h), (x+w, y+h-line_width), line_color, line_thickness) # bottom right
# Display the output
cv2.imshow('Detected Faces', image)
cv2.waitKey()
cv2.destroyAllWindows()
Ergebnis
