|
import cv2 |
|
import numpy as np |
|
import gradio as gr |
|
|
|
def remove_green_screen(video_file, bg_image): |
|
|
|
bg = cv2.imread(bg_image) |
|
|
|
|
|
cap = cv2.VideoCapture(video_file) |
|
|
|
|
|
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) |
|
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) |
|
|
|
|
|
fourcc = cv2.VideoWriter_fourcc(*"mp4v") |
|
out = cv2.VideoWriter("output.mp4", fourcc, 30, (width, height)) |
|
|
|
|
|
while True: |
|
|
|
ret, frame = cap.read() |
|
|
|
|
|
if not ret: |
|
break |
|
|
|
|
|
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) |
|
|
|
|
|
lower_green = np.array([40, 50, 50]) |
|
upper_green = np.array([90, 255, 255]) |
|
|
|
|
|
mask = cv2.inRange(hsv, lower_green, upper_green) |
|
|
|
|
|
mask = cv2.bitwise_not(mask) |
|
|
|
|
|
fg = cv2.bitwise_and(frame, frame, mask=mask) |
|
|
|
|
|
bg_mask = cv2.bitwise_not(mask) |
|
bg_mask = cv2.cvtColor(bg_mask, cv2.COLOR_GRAY2BGR) |
|
bg_fg = cv2.bitwise_and(bg, bg_mask) |
|
|
|
|
|
output = cv2.add(fg, bg_fg) |
|
|
|
|
|
out.write(output) |
|
|
|
|
|
cap.release() |
|
out.release() |
|
|
|
return "output.mp4" |
|
|
|
|
|
video_file = gr.inputs.Video(label="Input Video") |
|
bg_image = gr.inputs.Image(label="Background Image") |
|
output_file = gr.outputs.Video(label="Output Video") |
|
|
|
|
|
iface = gr.Interface(fn=remove_green_screen, inputs=[video_file, bg_image], outputs=output_file) |
|
|
|
|
|
iface.launch() |
|
|