| | |
| |
|
| | import cv2 as cv |
| | |
| | from drowsiness_detection import process_frame, reset_counters, DROWSY_COUNTER, YAWN_COUNTER, HEAD_DOWN_COUNTER |
| |
|
| | def process_video_with_progress(input_path, output_path, progress_callback=None): |
| | """ |
| | Processes a video file to detect drowsiness, providing progress updates. |
| | |
| | Args: |
| | input_path (str): Path to the input video file. |
| | output_path (str): Path to save the processed video file. |
| | progress_callback (function, optional): A function to call with progress updates. |
| | It receives (current_frame, total_frames). |
| | |
| | Returns: |
| | dict: A dictionary containing the final detection statistics. |
| | """ |
| | reset_counters() |
| | |
| | video_stream = cv.VideoCapture(input_path) |
| | if not video_stream.isOpened(): |
| | raise ValueError(f"Could not open video file {input_path}") |
| | |
| | |
| | fps = video_stream.get(cv.CAP_PROP_FPS) |
| | original_width = int(video_stream.get(cv.CAP_PROP_FRAME_WIDTH)) |
| | original_height = int(video_stream.get(cv.CAP_PROP_FRAME_HEIGHT)) |
| | total_frames = int(video_stream.get(cv.CAP_PROP_FRAME_COUNT)) |
| | |
| | |
| | |
| | output_width = 640 |
| | aspect_ratio = original_height / original_width |
| | output_height = int(output_width * aspect_ratio) |
| | output_dims = (output_width, output_height) |
| | |
| | |
| | fourcc = cv.VideoWriter_fourcc(*'mp4v') |
| | video_writer = cv.VideoWriter(output_path, fourcc, fps, output_dims) |
| | |
| | frame_count = 0 |
| | |
| | try: |
| | while True: |
| | ret, frame = video_stream.read() |
| | if not ret: |
| | break |
| | |
| | frame_count += 1 |
| | processed_frame = process_frame(frame) |
| | |
| | |
| | |
| | |
| | if processed_frame.shape[1] != output_dims[0] or processed_frame.shape[0] != output_dims[1]: |
| | processed_frame = cv.resize(processed_frame, output_dims) |
| | |
| | video_writer.write(processed_frame) |
| | |
| | if progress_callback: |
| | progress_callback(frame_count, total_frames) |
| | |
| | stats = { |
| | 'total_frames_processed': frame_count, |
| | 'drowsy_events': DROWSY_COUNTER, |
| | 'yawn_events': YAWN_COUNTER, |
| | 'head_down_events': HEAD_DOWN_COUNTER |
| | } |
| | return stats |
| | |
| | finally: |
| | video_stream.release() |
| | if video_writer: |
| | video_writer.release() |