""" 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