File size: 1,709 Bytes
06a815f
 
4e2d873
8db9899
06a815f
e8452a3
06a815f
 
c92e309
06a815f
e8452a3
06a815f
931480f
06a815f
 
 
a421f1e
06a815f
e8452a3
 
06a815f
 
 
 
 
 
 
 
 
e8452a3
06a815f
e8452a3
06a815f
931480f
06a815f
e8452a3
06a815f
 
 
 
4e2d873
06a815f
931480f
e8452a3
4e2d873
e8452a3
06a815f
 
 
e8452a3
06a815f
 
 
e8452a3
06a815f
 
e8452a3
06a815f
4e2d873
e8452a3
8db9899
06a815f
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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()