From 5d5a9077a93012828637dc577ce9a1737ddc288f Mon Sep 17 00:00:00 2001 From: Jonathan Frei Date: Wed, 14 Feb 2024 16:23:39 +0000 Subject: [PATCH] =?UTF-8?q?Dateien=20hochladen=20nach=20=E2=80=9Ecode?= =?UTF-8?q?=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/facedetection.py | 77 ++++++++++++++++++++++++++++++++++++++++++ code/facedetection1.py | 77 ++++++++++++++++++++++++++++++++++++++++++ code/facedetection2.py | 61 +++++++++++++++++++++++++++++++++ 3 files changed, 215 insertions(+) create mode 100644 code/facedetection.py create mode 100644 code/facedetection1.py create mode 100644 code/facedetection2.py diff --git a/code/facedetection.py b/code/facedetection.py new file mode 100644 index 0000000..b91864a --- /dev/null +++ b/code/facedetection.py @@ -0,0 +1,77 @@ +""" +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 diff --git a/code/facedetection1.py b/code/facedetection1.py new file mode 100644 index 0000000..b91864a --- /dev/null +++ b/code/facedetection1.py @@ -0,0 +1,77 @@ +""" +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 diff --git a/code/facedetection2.py b/code/facedetection2.py new file mode 100644 index 0000000..2b81e50 --- /dev/null +++ b/code/facedetection2.py @@ -0,0 +1,61 @@ +""" +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") + +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) + + # Detect faces + faces = faceCascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30)) + + # Extract ROIs and resize + for (x, y, w, h) in faces: + face_roi = cv2.resize(img[y:y+h, x:x+w], (500, 500)) + frame = face_roi.astype("float") / 255.0 + video_frames.append(frame) + + cap.release() + + + + for frame in video_frames: + cv2.imshow("frame", frame) + cv2.waitKey(20) + cv2.destroyAllWindows() + return video_frames, len(video_frames), fps