|
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- """
- Abhängigkeiten:
- - cv2 (OpenCV-Paket)
- - numpy
-
- Autor: Ihr Name
- Datum: Erstellungs- oder Änderungsdatum
- Version: Modulversion
- """
-
- import cv2
- import numpy as np
-
- faceCascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_alt2.xml")
- eyeCascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_eye.xml")
-
- def read_video(path):
- """
- Liest ein Video, erkennt Gesichter und extrahiert Regionen von Interesse (ROIs).
-
- Diese Funktion nimmt einen Pfad zu einer Videodatei und liest das Video. Während des Lesens erkennt sie
- Gesichter im Video und extrahiert die ROIs (Gesichtsbereiche), die anschließend in einer Liste von Frames
- gespeichert werden. Die Frames werden für spätere Verarbeitungsschritte skaliert.
-
- Args:
- path (str): Der Pfad zur Videodatei.
-
- Returns:
- tuple: Ein Tupel, bestehend aus:
- - video_frames (list): Eine Liste von Frames, die die ROIs (Gesichtsbereiche) darstellen.
- - frame_ct (int): Die Anzahl der extrahierten Frames.
- - fps (int): Die Bildrate (Frames pro Sekunde) des Videos.
- """
- cap = cv2.VideoCapture(path)
- fps = int(cap.get(cv2.CAP_PROP_FPS))
- video_frames = []
-
- while cap.isOpened():
- ret, img = cap.read()
- if not ret:
- break
-
- gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
- faces = faceCascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
-
- for (x, y, w, h) in faces:
- face_roi_gray = gray[y:y+h, x:x+w]
- face_roi_color = img[y:y+h, x:x+w]
- eyes = eyeCascade.detectMultiScale(face_roi_gray)
-
- # Annahme: Wir brauchen mindestens zwei Augen für die Berechnung
- if len(eyes) == 2:
- # Berechne die Position und Größe des Stirnbereichs
- eye1_x, eye1_y, eye1_w, eye1_h = eyes[0]
- eye2_x, eye2_y, eye2_w, eye2_h = eyes[1]
-
- # Bestimme die horizontale Position und Breite des Stirnbereichs
- forehead_x = min(eye1_x, eye2_x)
- forehead_w = max(eye1_x + eye1_w, eye2_x + eye2_w) - forehead_x
-
- # Bestimme die vertikale Position und Höhe des Stirnbereichs
- forehead_y = 0
- forehead_h = int((min(eye1_y, eye2_y) - forehead_y) / 3)
-
- # Extrahiere und skaliere den Stirnbereich
- forehead_roi = face_roi_color[forehead_y:forehead_y + forehead_h, forehead_x:forehead_x + forehead_w]
- forehead_resized = cv2.resize(forehead_roi, (500, 500))
- video_frames.append(forehead_resized.astype("float") / 255.0)
-
- cap.release()
-
- for frame in video_frames:
- cv2.imshow("frame", frame)
- cv2.waitKey(20)
- cv2.destroyAllWindows()
-
- return video_frames, len(video_frames), fps
|