|
import cv2 |
|
import numpy as np |
|
import gradio as gr |
|
from moviepy.editor import VideoFileClip |
|
import tempfile |
|
|
|
|
|
def adjust_brightness(frame, brightness_value): |
|
return cv2.convertScaleAbs(frame, alpha=1, beta=brightness_value) |
|
|
|
|
|
def overlay_frames(frame1, frame2, opacity=0.5): |
|
return cv2.addWeighted(frame1, opacity, frame2, 1 - opacity, 0) |
|
|
|
|
|
def process_video(video, frame_diff, brightness_value): |
|
|
|
input_path = video.name |
|
cap = cv2.VideoCapture(input_path) |
|
|
|
|
|
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) |
|
fps = cap.get(cv2.CAP_PROP_FPS) |
|
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) |
|
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) |
|
|
|
|
|
output_path = tempfile.mktemp(suffix=".mp4") |
|
fourcc = cv2.VideoWriter_fourcc(*'mp4v') |
|
out = cv2.VideoWriter(output_path, fourcc, fps, (width, height)) |
|
|
|
frames = [] |
|
|
|
|
|
while True: |
|
ret, frame = cap.read() |
|
if not ret: |
|
break |
|
frames.append(frame) |
|
|
|
|
|
for f in range(frame_diff, frame_count - frame_diff): |
|
|
|
prev_frame = 255 - frames[f - frame_diff] |
|
current_frame = frames[f] |
|
|
|
|
|
overlayed_frame = overlay_frames(prev_frame, current_frame, opacity=0.5) |
|
|
|
|
|
bright_frame = adjust_brightness(overlayed_frame, brightness_value) |
|
|
|
|
|
out.write(bright_frame) |
|
|
|
cap.release() |
|
out.release() |
|
|
|
return output_path |
|
|
|
|
|
def video_motion_amplify(video, frame_diff_value, brightness_value): |
|
|
|
output_video_path = process_video(video, frame_diff_value, brightness_value) |
|
|
|
|
|
return output_video_path |
|
|
|
|
|
interface = gr.Interface( |
|
fn=video_motion_amplify, |
|
inputs=[ |
|
gr.inputs.Video(type="file"), |
|
gr.inputs.Slider(minimum=0, maximum=50, step=1, label="Frame Difference Value"), |
|
gr.inputs.Slider(minimum=-100, maximum=100, step=1, label="Brightness Value"), |
|
], |
|
outputs=gr.outputs.Video(type="file"), |
|
title="Motion Amplification using Frame Difference", |
|
description="This app amplifies motion in a video by overlaying frames based on frame difference and adjusting brightness." |
|
) |
|
|
|
|
|
interface.launch() |