import gradio as gr import cv2 import os import random import time from services.video_service import get_random_video_frame from services.metrics_service import update_metrics from services.overlay_service import overlay_boxes # Constants TEMP_IMAGE_PATH = "temp_frame.jpg" VIDEO_FOLDER = "data/sample_videos" # State Variables paused = False frame_rate = 1 # Default 1 FPS # Helper Functions def monitor_feed(): global paused frame = get_random_video_frame() if frame is None: return None, update_metrics() if not paused: frame = overlay_boxes(frame) cv2.imwrite(TEMP_IMAGE_PATH, frame) return TEMP_IMAGE_PATH, update_metrics() def toggle_pause(): global paused paused = not paused def set_frame_rate(value): global frame_rate frame_rate = int(value) def loop_monitor(): while True: time.sleep(1 / frame_rate if frame_rate > 0 else 1) yield monitor_feed() # Gradio App def build_interface(): with gr.Blocks() as app: with gr.Row(): with gr.Column(): video_output = gr.Image(label="Live Drone Feed") with gr.Column(): metrics_output = gr.Label(label="Live Metrics") with gr.Row(): pause_button = gr.Button("Pause / Resume") frame_rate_slider = gr.Slider(1, 10, value=1, step=1, label="Frame Rate (Frames per second)") pause_button.click(toggle_pause) frame_rate_slider.change(set_frame_rate, inputs=[frame_rate_slider]) app.load(fn=loop_monitor, outputs=[video_output, metrics_output]) return app # Launch if __name__ == "__main__": demo = build_interface() demo.queue().launch()