video-animator / rembg_video.py
root
Face fusion + removing background
c5ac071
import cv2
import numpy as np
import time
import random
from PIL import Image
import argparse
import subprocess
from transparent_background import Remover
import os
import torch
def process_video(input_video, output_video, mode='Normal'):
if mode == 'Fast':
remover = Remover(mode='fast')
else:
remover = Remover()
cap = cv2.VideoCapture(input_video)
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) # Get total frames
processed_frames = 0
start_time = time.time()
# Get video properties
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))
# Start ffmpeg subprocess
ffmpeg_command = [
'ffmpeg',
'-y', # Overwrite output file if it exists
'-f', 'rawvideo',
'-vcodec', 'rawvideo',
'-pix_fmt', 'rgb24',
'-s', f'{width}x{height}', # Size of one frame
'-r', str(fps), # Frames per second
'-i', '-', # Input from pipe
'-c:v', 'libx264',
'-crf', '0',
output_video
]
proc = subprocess.Popen(ffmpeg_command, stdin=subprocess.PIPE)
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
if time.time() - start_time >= 20 * 60 - 5:
print("GPU Timeout is coming")
cap.release()
proc.stdin.close()
proc.wait()
return output_video
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
img = Image.fromarray(frame).convert('RGB')
processed_frames += 1
print(f"Processing frame {processed_frames}/{total_frames}")
out = remover.process(img, type='green')
proc.stdin.write(np.array(out).tobytes())
cap.release()
proc.stdin.close()
proc.wait()
print(f"Output video saved to {output_video}")
return output_video
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Remove background from video using transparent_background library.")
parser.add_argument('input', type=str, help='Input video file path')
parser.add_argument('output', type=str, help='Output video file path')
parser.add_argument('--mode', type=str, default='Normal', choices=['Fast', 'Normal'], help='Mode of operation')
args = parser.parse_args()
process_video(args.input, args.output, args.mode)