File size: 1,439 Bytes
0094cc8
 
8901f41
 
0094cc8
 
2911157
 
0094cc8
 
 
 
 
2911157
0094cc8
 
2911157
 
 
 
 
 
0094cc8
2911157
 
 
 
 
 
 
 
 
 
 
 
 
 
0094cc8
2911157
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
import cv2
import numpy as np
import gradio as gr

def remove_green_screen(video_file, bg_image):
    cap = cv2.VideoCapture(video_file)
    bg = cv2.imread(bg_image)
    img_array = []
    while True:
        ret, frame = cap.read()
        if not ret:
            break
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        lower_green = np.array([30, 60, 60])
        upper_green = np.array([90, 255, 255])
        mask = cv2.inRange(hsv, lower_green, upper_green)
        mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, np.ones((3,3),np.uint8))
        mask = cv2.dilate(mask, np.ones((3,3),np.uint8), iterations=5)
        mask = cv2.blur(mask, (30,30))
        mask = np.stack([mask, mask, mask], axis=2)
        frame = np.where(mask == np.array([255, 255, 255]), bg, frame)
        img_array.append(frame)
    cap.release()
    output_file = "output.mp4"
    fourcc = cv2.VideoWriter_fourcc(*"mp4v")
    fps = 30.0
    height, width, layers = img_array[0].shape
    size = (width,height)
    out = cv2.VideoWriter(output_file, fourcc, fps, size)
    for i in range(len(img_array)):
        out.write(img_array[i])
    out.release()
    return output_file

input_video = gr.inputs.Video(type="mp4")
input_bg = gr.inputs.Image(label="Background Image")
output_video = gr.outputs.Video(type="mp4")

gr.Interface(fn=remove_green_screen, inputs=[input_video, input_bg], outputs=output_video, title="Green Screen Remover").launch()