Spaces:
Sleeping
Sleeping
""" | |
# Copyright 2020 Adobe | |
# All Rights Reserved. | |
# NOTICE: Adobe permits you to use, modify, and distribute this file in | |
# accordance with the terms of the Adobe license agreement accompanying | |
# it. | |
""" | |
import os, glob | |
import numpy as np | |
import cv2 | |
import scipy.ndimage | |
fs = ['suit1_pred_fls_t7_audio_embed.mp4' ] | |
for f in fs: | |
os.system('ffmpeg -y -i MakeItTalk/examples/{} -filter:v crop=256:256:256:0 -strict -2 MakeItTalk/examples/crop_{}'.format(f, f)) | |
cap = cv2.VideoCapture('MakeItTalk/examples/crop_{}'.format(f)) | |
writer = cv2.VideoWriter('MakeItTalk/examples/tmp_{}.mp4'.format(f[:-4]), | |
cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 62.5, (256, 256)) | |
length = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) | |
ret, frame1 = cap.read() | |
prvs = cv2.cvtColor(frame1,cv2.COLOR_BGR2GRAY) | |
fir = np.copy(prvs) | |
# params for ShiTomasi corner detection | |
feature_params = dict( maxCorners = 100, | |
qualityLevel = 0.9, | |
minDistance = 3, | |
blockSize = 3) | |
# Parameters for lucas kanade optical flow | |
lk_params = dict( winSize = (15,15), | |
maxLevel = 2, | |
criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03)) | |
# Create some random colors | |
color = np.random.randint(0,255,(100,3)) | |
# Take first frame and find corners in it | |
ret, old_frame = cap.read() | |
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY) | |
mask = np.zeros_like(old_gray) | |
mask[-50:, 128:] = 1 | |
p0 = cv2.goodFeaturesToTrack(old_gray, mask = mask, **feature_params) | |
p0 = p0[0:1] | |
ori_ab = None | |
# Create a mask image for drawing purposes | |
mask = np.zeros_like(old_frame) | |
ii = 0 | |
while(ii>-1): | |
print(f, ii, length) | |
ii += 1 | |
ret,frame = cap.read() | |
if(not ret): | |
break | |
frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) | |
# calculate optical flow | |
p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params) | |
# Select good points | |
good_new = p1[st==1] | |
good_old = p0[st==1] | |
# draw the tracks | |
for i,(new,old) in enumerate(zip(good_new,good_old)): | |
a,b = new.ravel() | |
c,d = old.ravel() | |
# mask = cv2.line(mask, (a,b),(c,d), color[i].tolist(), 2) | |
# frame = cv2.circle(frame,(a,b),5,color[i].tolist(),-1) | |
if(ori_ab is None): | |
ori_ab = [a, b] | |
# add dot | |
# img = cv2.add(frame,mask) | |
# rgb = img | |
rgb = scipy.ndimage.shift(frame, shift=[ori_ab[1]-b, ori_ab[0]-a, 0], mode='reflect') | |
# cv2.imshow('frame',rgb) | |
writer.write(rgb) | |
# Now update the previous frame and previous points | |
old_gray = frame_gray.copy() | |
p0 = good_new.reshape(-1,1,2) | |
cv2.destroyAllWindows() | |
cap.release() | |
writer.release() | |
f = f[:-4] | |
os.system('ffmpeg -loglevel error -y -i {} -vn {}'.format( | |
os.path.join('../examples', '{}.mp4'.format(f)), os.path.join('../examples', 'a_' + f + '.wav') | |
)) | |
os.system('ffmpeg -loglevel error -y -i {} -i {} -pix_fmt yuv420p -shortest -strict -2 {}'.format( | |
os.path.join('../examples', 'tmp_{}.mp4'.format(f)), os.path.join('../examples', 'a_' + f + '.wav'), | |
os.path.join('../examples', 'f_' + f + '.mp4') | |
)) | |
os.remove(os.path.join('../examples', 'tmp_{}.mp4'.format(f))) | |
os.remove(os.path.join('../examples', 'a_' + f + '.wav')) | |