You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

facedetection.py 2.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. """
  2. Abhängigkeiten:
  3. - cv2 (OpenCV-Paket)
  4. - numpy
  5. Autor: Ihr Name
  6. Datum: Erstellungs- oder Änderungsdatum
  7. Version: Modulversion
  8. """
  9. import cv2
  10. import numpy as np
  11. faceCascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_alt2.xml")
  12. eyeCascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_eye.xml")
  13. def read_video(path):
  14. """
  15. Liest ein Video, erkennt Gesichter und extrahiert Regionen von Interesse (ROIs).
  16. Diese Funktion nimmt einen Pfad zu einer Videodatei und liest das Video. Während des Lesens erkennt sie
  17. Gesichter im Video und extrahiert die ROIs (Gesichtsbereiche), die anschließend in einer Liste von Frames
  18. gespeichert werden. Die Frames werden für spätere Verarbeitungsschritte skaliert.
  19. Args:
  20. path (str): Der Pfad zur Videodatei.
  21. Returns:
  22. tuple: Ein Tupel, bestehend aus:
  23. - video_frames (list): Eine Liste von Frames, die die ROIs (Gesichtsbereiche) darstellen.
  24. - frame_ct (int): Die Anzahl der extrahierten Frames.
  25. - fps (int): Die Bildrate (Frames pro Sekunde) des Videos.
  26. """
  27. cap = cv2.VideoCapture(path)
  28. fps = int(cap.get(cv2.CAP_PROP_FPS))
  29. video_frames = []
  30. while cap.isOpened():
  31. ret, img = cap.read()
  32. if not ret:
  33. break
  34. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  35. faces = faceCascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
  36. for (x, y, w, h) in faces:
  37. face_roi_gray = gray[y:y+h, x:x+w]
  38. face_roi_color = img[y:y+h, x:x+w]
  39. eyes = eyeCascade.detectMultiScale(face_roi_gray)
  40. # Annahme: Wir brauchen mindestens zwei Augen für die Berechnung
  41. if len(eyes) == 2:
  42. # Berechne die Position und Größe des Stirnbereichs
  43. eye1_x, eye1_y, eye1_w, eye1_h = eyes[0]
  44. eye2_x, eye2_y, eye2_w, eye2_h = eyes[1]
  45. # Bestimme die horizontale Position und Breite des Stirnbereichs
  46. forehead_x = min(eye1_x, eye2_x)
  47. forehead_w = max(eye1_x + eye1_w, eye2_x + eye2_w) - forehead_x
  48. # Bestimme die vertikale Position und Höhe des Stirnbereichs
  49. forehead_y = 0
  50. forehead_h = int((min(eye1_y, eye2_y) - forehead_y) / 3)
  51. # Extrahiere und skaliere den Stirnbereich
  52. forehead_roi = face_roi_color[forehead_y:forehead_y + forehead_h, forehead_x:forehead_x + forehead_w]
  53. forehead_resized = cv2.resize(forehead_roi, (500, 500))
  54. video_frames.append(forehead_resized.astype("float") / 255.0)
  55. cap.release()
  56. for frame in video_frames:
  57. cv2.imshow("frame", frame)
  58. cv2.waitKey(20)
  59. cv2.destroyAllWindows()
  60. return video_frames, len(video_frames), fps