Macobytes

─ Coding | Tutorials | Hardware | Tests ─

Gesichtserkennung mit OpenCV

 

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 Haar-Cascade-Klassifikator 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 Klassifikators auf Gesichter geprüft. Die Methode dafür heißt detectMultiScale() der wir verschiedene Parameter übergeben.

Der erste Parameter in dieser Methode heißt grey_image und ist das Graustufenbild, das wir zuvor erstellt haben.

Der zweite Parameter in dieser Methode heißt scaleFactor.
Mit ihm wird die Größe des Eingangsbildes verkleinert, damit der Algorithmus größere Gesichter leichter erkennen kann. In diesem Fall haben wir einen Skalierungsfaktor von 1,65 angegeben, was bedeutet, dass wir das Bild um 65% verkleinern wollen.

Der dritte Parameter in dieser Methode heißt minNeighbors.
Der Klassifikator wird uns evtl. false-positive Ergebnisse liefern.
Diese werden mit dem Parameter minNeighbors eliminiert, der die Anzahl der benachbarten Rechtecke angibt, die identifiziert werden müssen, damit ein Objekt als gültig erkannt wird.

Die Kunst besteht darin, einen Kompromiss zwischen scaleFactor und minNeighborszu finden, der es uns ermöglicht, Falschmeldungen zu eliminieren und gleichzeitig die richtigen Gesichter zu erkennen.

Optional können wir noch den vierten Parameter minSize angeben. Dieser legt die Mindestgröße des zu erfassenden Objektes fest. Das Modell ignoriert Flächen, die kleiner als die angegebene Mindestgröße sind.

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

Weiter Beitrag

Zurück Beitrag

Antworten

© 2026 Macobytes

Impressum | Datenschutzerklärung