import os
import sys
from datetime import datetime
from itertools import cycle, islice
import cv2
import numpy as np
def addimage(origin_pic, background_pic):
img1 = cv2.imread(origin_pic)
print(origin_pic, img1.shape)
height, width, channels = img1.shape
img2 = cv2.imread(background_pic)
img2 = cv2.resize(img2, dsize=(width, height))
cv2.namedWindow("task")
color_dist = {'green': {'Lower': np.array([26, 104, 85]), 'Upper': np.array([100, 255, 255])}}
hsv = cv2.cvtColor(img1, cv2.COLOR_RGB2HSV)
background_mask = cv2.inRange(hsv, color_dist['green']['Lower'], color_dist['green']['Upper'])
person_mask = ~background_mask
scenic_img = cv2.bitwise_and(img2, img2, mask=background_mask)
person_img = cv2.bitwise_and(img1, img1, mask=person_mask)
alpha_img = cv2.addWeighted(scenic_img, 0.7, person_img, 1, 0)
res_file = f'result/{origin_pic.split("/")[-1]}'
print(res_file)
if not os.path.exists('result'):
os.system('mkdir result')
cv2.imwrite(res_file, alpha_img)
def pre_run():
temp_dirs = ['pictures', 'background', 'result']
for td in temp_dirs:
if os.path.exists(td):
cmd = f'rm -rf {td}/*.png'
else:
cmd = f'mkdir {td}'
os.system(cmd)
def main(origin_mp4, background_mp4):
now = datetime.now().strftime("%Y%m%d-%H%M%S")
print(now)
pre_run()
cmds = [f'ffmpeg -i {origin_mp4} pictures/op_%04d.png',
f'ffmpeg -i {origin_mp4} -vn -ar 44100 -ab 128k -f mp3 output_{now}.mp3 -y',
f'ffmpeg -i {background_mp4} background/op_%04d.png',
]
for cmd in cmds:
os.system(cmd)
origin_pics = os.listdir('pictures')
origin_pics.sort()
background_pics = os.listdir('background')
background_pics.sort()
bg_extended = list(islice(cycle(background_pics), len(origin_pics)))
for i in range(len(origin_pics)):
addimage(f'pictures/{origin_pics[i]}', f'background/{bg_extended[i]}')
cmds = [f'ffmpeg -framerate 30 -i result/op_%04d.png -c:v libx264 -r 30 temp_{now}.mp4 -y',
f'ffmpeg -i ./temp_{now}.mp4 -i ./output_{now}.mp3 -c copy -map 0:v:0 -map 1:a:0 -shortest output_{now}.mp4 -y']
for cmd in cmds:
os.system(cmd)
if __name__ == "__main__":
args = sys.argv[:]
main(args[1], args[2])