|
import gradio as gr |
|
import cv2 |
|
import numpy as np |
|
from framevis import FrameVis |
|
|
|
def process_video(video_path, nframes, height, width, direction, trim, average, blur_amount): |
|
"""Process video using FrameVis and return the visualization""" |
|
try: |
|
fv = FrameVis() |
|
|
|
|
|
cap = cv2.VideoCapture(video_path) |
|
video_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) |
|
video_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) |
|
cap.release() |
|
|
|
|
|
if width <= 0: |
|
|
|
width = video_width * 2 |
|
|
|
if height <= 0: |
|
|
|
if direction == "horizontal": |
|
height = int((width / video_width) * video_height) |
|
else: |
|
height = video_height |
|
|
|
|
|
output_image = fv.visualize( |
|
video_path, |
|
nframes=nframes, |
|
height=height, |
|
width=width, |
|
direction=direction, |
|
trim=trim, |
|
quiet=False |
|
) |
|
|
|
|
|
if average: |
|
output_image = fv.average_image(output_image, direction) |
|
elif blur_amount > 0: |
|
output_image = fv.motion_blur(output_image, direction, blur_amount) |
|
|
|
|
|
output_image = cv2.cvtColor(output_image, cv2.COLOR_BGR2RGB) |
|
return output_image |
|
|
|
except Exception as e: |
|
raise gr.Error(str(e)) |
|
|
|
|
|
with gr.Blocks(title="FrameVis - Video Frame Visualizer") as demo: |
|
gr.Markdown(""" |
|
# 🎬 FrameVis - Video Frame Visualizer |
|
Upload a video to create a beautiful visualization of its frames. The tool will extract frames at regular intervals |
|
and combine them into a single image. For best results with horizontal layout, try setting width to match your screen width. |
|
""") |
|
|
|
with gr.Row(): |
|
with gr.Column(scale=1): |
|
|
|
video_input = gr.Video(label="Upload Video") |
|
with gr.Row(): |
|
nframes = gr.Slider(minimum=1, maximum=2000, value=100, step=1, |
|
label="Number of Frames") |
|
direction = gr.Radio(["horizontal", "vertical"], value="horizontal", |
|
label="Direction") |
|
|
|
with gr.Row(): |
|
height = gr.Number(value=0, label="Frame Height (0 for auto)") |
|
width = gr.Number(value=0, label="Frame Width (0 for auto)") |
|
|
|
with gr.Row(): |
|
trim = gr.Checkbox(label="Auto-trim black bars") |
|
average = gr.Checkbox(label="Average colors") |
|
blur_amount = gr.Slider(minimum=0, maximum=200, value=0, step=1, |
|
label="Motion Blur Amount") |
|
|
|
process_btn = gr.Button("Generate Visualization", variant="primary") |
|
|
|
with gr.Column(scale=2): |
|
|
|
output_image = gr.Image(label="Visualization Result") |
|
|
|
|
|
process_btn.click( |
|
fn=process_video, |
|
inputs=[ |
|
video_input, |
|
nframes, |
|
height, |
|
width, |
|
direction, |
|
trim, |
|
average, |
|
blur_amount |
|
], |
|
outputs=output_image |
|
) |
|
|
|
if __name__ == "__main__": |
|
demo.launch() |