File size: 2,039 Bytes
077d557
de2aa9b
ba4d1a9
 
c14239b
e50e349
e6399c3
ba4d1a9
 
caf9fa8
ba4d1a9
077d557
6ef9294
7d9cecc
6ef9294
e50e349
90ab22e
 
c14239b
 
e50e349
6ef9294
90ab22e
 
 
6ef9294
e50e349
90ab22e
 
 
 
c14239b
90ab22e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c14239b
e50e349
6ef9294
90ab22e
 
c14239b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ce6434e
9444948
ce6434e
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
66
67
68
69
70
71
import spaces
import gradio as gr
import cv2
import numpy as np
import os

from PIL import Image
from transparent_background import Remover

remover = Remover()

@spaces.GPU
def doo(video):
    cap = cv2.VideoCapture(video)
    fps = cap.get(cv2.CAP_PROP_FPS)
    
    writer = None
    frame_count = 0
    max_frames = 400  # Maximum number of frames to process at a time
    segment_count = 0  # Count of video segments processed
    
    while cap.isOpened():
        ret, frame = cap.read()
    
        if ret is False:
            break
            
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) 
        img = Image.fromarray(frame).convert('RGB')
    
        if writer is None:
            writer = cv2.VideoWriter(f'output_{segment_count}.mp4', cv2.VideoWriter_fourcc(*'mp4v'), fps, img.size)
    
        out = remover.process(img, type='green')
        writer.write(cv2.cvtColor(np.array(out), cv2.COLOR_BGR2RGB))
        
        frame_count += 1
        if frame_count >= max_frames:
            cap.release()
            writer.release()
            
            # Process the next segment
            cap = cv2.VideoCapture(video)
            for _ in range(frame_count):
                cap.read()  # Skip frames that have already been processed
            writer = None
            frame_count = 0
            segment_count += 1
    
    cap.release()
    if writer is not None:
        writer.release()

    # Concatenate all the video segments
    final_output = cv2.VideoWriter('final_output.mp4', cv2.VideoWriter_fourcc(*'mp4v'), fps, img.size)
    for i in range(segment_count):
        cap = cv2.VideoCapture(f'output_{i}.mp4')
        while cap.isOpened():
            ret, frame = cap.read()
            if ret is False:
                break
            final_output.write(frame)
        cap.release()
        os.remove(f'output_{i}.mp4')  # Delete the segment file
    final_output.release()

    return 'final_output.mp4'

iface = gr.Interface(fn=doo, inputs="video", outputs="video")
iface.launch()