""" Video Processing Utility for Drowsiness Detection This script provides a more robust video processing interface """ import cv2 as cv import os import json from datetime import datetime import argparse def get_video_info(video_path): """Get detailed video information""" cap = cv.VideoCapture(video_path) if not cap.isOpened(): return None info = { 'fps': cap.get(cv.CAP_PROP_FPS), 'width': int(cap.get(cv.CAP_PROP_FRAME_WIDTH)), 'height': int(cap.get(cv.CAP_PROP_FRAME_HEIGHT)), 'total_frames': int(cap.get(cv.CAP_PROP_FRAME_COUNT)), 'duration': cap.get(cv.CAP_PROP_FRAME_COUNT) / cap.get(cv.CAP_PROP_FPS) if cap.get(cv.CAP_PROP_FPS) > 0 else 0, 'codec': int(cap.get(cv.CAP_PROP_FOURCC)), 'file_size': os.path.getsize(video_path) } cap.release() return info def create_processing_report(input_path, output_path, stats): """Create a JSON report of the processing results""" report = { 'timestamp': datetime.now().isoformat(), 'input_file': input_path, 'output_file': output_path, 'video_info': get_video_info(input_path), 'detection_stats': stats, 'processing_info': { 'software': 'Drowsiness Detection System', 'version': '1.0' } } report_path = output_path.replace('.mp4', '_report.json') with open(report_path, 'w') as f: json.dump(report, f, indent=2) return report_path def process_video_with_progress(input_path, output_path, progress_callback=None): """ Process video with progress callback progress_callback: function that takes (current_frame, total_frames) """ # Import the drowsiness detection functions from drowsiness_detection import process_frame, reset_counters from drowsiness_detection import DROWSY_COUNTER, YAWN_COUNTER, HEAD_DOWN_COUNTER reset_counters() # Open video file video_stream = cv.VideoCapture(input_path) if not video_stream.isOpened(): raise ValueError(f"Could not open video file {input_path}") # Get video properties fps = int(video_stream.get(cv.CAP_PROP_FPS)) width = int(video_stream.get(cv.CAP_PROP_FRAME_WIDTH)) height = int(video_stream.get(cv.CAP_PROP_FRAME_HEIGHT)) total_frames = int(video_stream.get(cv.CAP_PROP_FRAME_COUNT)) # Setup video writer fourcc = cv.VideoWriter_fourcc(*'mp4v') video_writer = cv.VideoWriter(output_path, fourcc, fps, (640, 480)) frame_count = 0 try: while True: ret, frame = video_stream.read() if not ret: break frame_count += 1 # Process frame processed_frame = process_frame(frame) # Write frame to output video video_writer.write(processed_frame) # Call progress callback if provided if progress_callback: progress_callback(frame_count, total_frames) # Get final stats stats = { 'total_frames': frame_count, 'drowsy_events': DROWSY_COUNTER, 'yawn_events': YAWN_COUNTER, 'head_down_events': HEAD_DOWN_COUNTER } return stats finally: video_stream.release() video_writer.release() def main(): parser = argparse.ArgumentParser(description='Video Processing Utility for Drowsiness Detection') parser.add_argument('--input', '-i', required=True, help='Input video file path') parser.add_argument('--output', '-o', help='Output video file path (optional)') parser.add_argument('--report', '-r', action='store_true', help='Generate processing report') parser.add_argument('--info', action='store_true', help='Show video information only') args = parser.parse_args() if not os.path.exists(args.input): print(f"Error: Input file {args.input} does not exist") return # Show video info if args.info: info = get_video_info(args.input) if info: print(f"Video Information for: {args.input}") print(f"Resolution: {info['width']}x{info['height']}") print(f"FPS: {info['fps']:.2f}") print(f"Duration: {info['duration']:.2f} seconds") print(f"Total Frames: {info['total_frames']}") print(f"File Size: {info['file_size'] / (1024*1024):.2f} MB") else: print("Error: Could not read video file") return # Generate output path if not provided if not args.output: base_name