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.

excel_processing.py 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. """
  2. Abhängigkeiten:
  3. - pyramids (für den Aufbau der Bildpyramiden)
  4. - heartrate (zur Berechnung der Herzfrequenz)
  5. - preprocessing (für die Video-Vorverarbeitung)
  6. - eulerian (für die Euler'sche Video-Magnifikation)
  7. - tkinter und constants (für die GUI und Konstantenverwaltung)
  8. Autor: Roberto Gelsinger
  9. Datum: 07.12.2023
  10. Version: Modulversion
  11. """
  12. import pyramids
  13. import heartrate
  14. import facedetection
  15. import eulerian
  16. from constants import freq_max, freq_min
  17. import pandas as pd
  18. from excel_update import color_cells_based_on_deviation
  19. from excel_evaluation import evaluation
  20. def process_video_for_excel(selected_video_name):
  21. """
  22. Verarbeitet ein ausgewähltes Video, um die Herzfrequenz der abgebildeten Person zu ermitteln.
  23. Dieser Prozess umfasst die Vorverarbeitung des Videos, den Aufbau einer Laplace-Pyramide,
  24. die Anwendung von FFT-Filterung und Euler'scher Magnifikation, und schließlich die Berechnung
  25. der Herzfrequenz aus den Video-Daten.
  26. Args:
  27. selected_video_name (str): Der Name des zu verarbeitenden Videos.
  28. Returns:
  29. None: Die Funktion gibt direkt die berechnete Herzfrequenz auf der Konsole aus.
  30. """
  31. print("Reading + preprocessing video...")
  32. video_frames, frame_ct, fps = facedetection.read_video("videos/"+selected_video_name)
  33. print(len(video_frames))
  34. print("Building Laplacian video pyramid...")
  35. lap_video = pyramids.build_video_pyramid(video_frames)
  36. print(len(lap_video))
  37. for i, video in enumerate(lap_video):
  38. print("test")
  39. if i == 0 or i == len(lap_video)-1:
  40. continue
  41. print("Running FFT and Eulerian magnification...")
  42. result, fft, frequencies = eulerian.fft_filter(video, freq_min, freq_max, fps)
  43. lap_video[i] += result
  44. print("Calculating heart rate...")
  45. heart_rate = heartrate.find_heart_rate(fft, frequencies, freq_min, freq_max)
  46. print("Heart rate: ", heart_rate*0.7, "bpm")
  47. return heart_rate *0.7
  48. def process_all_videos_and_save_results(testcase_excel_file_path, testruns_excel_file_path, code_version, kommentar):
  49. try:
  50. df_testruns = pd.read_excel(testruns_excel_file_path)
  51. except FileNotFoundError:
  52. df_testruns = pd.DataFrame()
  53. df_testcases = pd.read_excel(testcase_excel_file_path)
  54. existing_testcases = [col for col in df_testruns.columns if col.startswith('Testcase_')]
  55. new_testcases = [f'Testcase_{tc}' for tc in df_testcases['Testcase'] if f'Testcase_{tc}' not in existing_testcases]
  56. if df_testruns.empty:
  57. df_testruns = pd.DataFrame(columns=['Testnummer', 'Codeversion', 'Kommentar', 'Abweichung'])
  58. for col in new_testcases:
  59. df_testruns[col] = None
  60. df_testruns.to_excel(testruns_excel_file_path, index=False)
  61. if new_testcases:
  62. print(f"Folgende neue Testcases wurden hinzugefügt: {new_testcases}")
  63. else:
  64. print("Keine neuen Testcases zum Hinzufügen gefunden.")
  65. next_testcase_index = len(df_testruns) + 1
  66. new_run = {
  67. 'Testnummer': next_testcase_index,
  68. 'Codeversion': code_version,
  69. 'Kommentar': kommentar,
  70. 'Abweichung': 'Wert_für_Abweichung'
  71. }
  72. for index, row in df_testcases.iterrows():
  73. video_name = row['VideoName']
  74. heart_rate = process_video_for_excel(video_name)
  75. testcase_column_name = f'Testcase_{row["Testcase"]}'
  76. new_run[testcase_column_name] = heart_rate
  77. try:
  78. df_testruns = df_testruns._append(new_run, ignore_index=True)
  79. except TypeError:
  80. pass
  81. df_testruns.to_excel(testruns_excel_file_path, index=False)
  82. print("Testrun wurde verarbeitet und das Ergebnis in der Testruns-Excel-Datei gespeichert.")
  83. color_cells_based_on_deviation(testruns_excel_file_path, testcase_excel_file_path)
  84. print("Zellen gefärbt")
  85. evaluation(testcase_excel_file_path, testruns_excel_file_path)
  86. print("Testcases sortiert")