import gradio as gr import cv2 import time import os from services.video_service import get_random_video_frame from services.thermal_service import detect_thermal_anomalies from services.overlay_service import overlay_boxes from services.metrics_service import update_metrics paused = False frame_rate = 1.0 # seconds def monitor_feed(): global paused if paused: frame = get_random_video_frame() # Still fetch to keep system active else: frame = get_random_video_frame() detected_boxes = detect_thermal_anomalies(frame) frame = overlay_boxes(frame, detected_boxes) metrics = update_metrics(detected_boxes) return frame[:, :, ::-1], metrics # BGR → RGB return frame[:, :, ::-1], {"Detections": 0} with gr.Blocks() as app: gr.Markdown("# 🌡️ Solar Surveillance Thermal Monitoring") with gr.Row(): with gr.Column(scale=3): video_output = gr.Image(label="Live Video Feed", elem_id="video-feed") with gr.Column(scale=1): metrics_output = gr.Label(label="Detection Metrics") with gr.Row(): pause_btn = gr.Button("⏸️ Pause") resume_btn = gr.Button("▶️ Resume") frame_slider = gr.Slider(0.5, 5.0, step=0.1, value=1.0, label="Frame Interval (seconds)") def toggle_pause(): global paused paused = True def toggle_resume(): global paused paused = False def set_frame_rate(val): global frame_rate frame_rate = val pause_btn.click(toggle_pause) resume_btn.click(toggle_resume) frame_slider.change(set_frame_rate, inputs=[frame_slider]) def streaming_loop(): while True: frame, metrics = monitor_feed() yield frame, metrics time.sleep(frame_rate) app.load(streaming_loop, outputs=[video_output, metrics_output]) if __name__ == "__main__": app.launch()