做视频特效时常用一种画面拼接的手法,可以实现在一个场景中同一个人与自己同框做出不同动作的效果。
我们知道,从视频到图像,从图像到像素,这一层层深入下来,我们只要能操纵每一个像素点的值,就可以实现任意想要的移花接木效果。
下面,来尝试使用Python+opencv实现自己与自己同框的视频特效。
要求同一个主体(人或动物、物体均可)在同一场景的不同位置拍摄两段视频。为了方便后切裁切,最好在镜头左端面向右端拍摄一段,然后在镜头右端面向左端拍另外一段。
# -*- coding: utf-8 -*-
"""
Created on Tue Sep 11 11:24:11 2018
@author: Leon
内容:
图像的处理与拼接
"""
import numpy as np
import cv2
from PIL import Image,ImageDraw,ImageFont
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.MP4',fourcc, 20.0, (640,480))
cv2.namedWindow("test")
# 获取视频素材:这里读取的是你提前准备好的两段视频
video = cv2.VideoCapture('org.MP4',0)
video2 = cv2.VideoCapture('org2.MP4',0)
def CH_WordDraw(img,text,size,x,y,r,g,b):
# 添加中文函数:在原图上添加中文
img_rbg = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
img_PIL = Image.fromarray(img_rbg)
draw = ImageDraw.Draw(img_PIL)
font = ImageFont.truetype('simhei.ttf',size,encoding='utf-8')
draw.text((x,y),text,(r,g,b),font=font)
return cv2.cvtColor(np.array(img_PIL),cv2.COLOR_RGB2BGR)
kk=0
while video.isOpened()&video2.isOpened():
_,frame = video.read()
_2,frame2 = video2.read()
kk=kk+1
if not (_2&_):
break
frame = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
frame2 = cv2.cvtColor(frame2,cv2.COLOR_BGR2HSV)
frame[:,:,2] = frame[:,:,2]-3
frame = cv2.cvtColor(frame,cv2.COLOR_HSV2BGR)
frame2 = cv2.cvtColor(frame2,cv2.COLOR_HSV2BGR)
img_video = frame[:,0:int(frame.shape[1]/2),:]
img_video2 = frame2[:,int(frame2.shape[1]/2):,:]
if kk>50:
img_video = CH_WordDraw(img_video,'你是不是傻?',40,70,50,222,0,0)
if kk >90:
img_video2 = CH_WordDraw(img_video2,'······',40,50,100,222,0,0)
img_out = np.hstack((img_video,img_video2))
cv2.adaptiveThreshold(frame,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,0)
cv2.imshow("test",img_out)
if cv2.waitKey(5)&0xFF==ord('q'):
break
# 保存视频
out.write(img_out)
#释放相关资源
video.release()
video2.release()
out.release()
cv2.destroyAllWindows()
效果如下(手动打了码[捂脸],如何给视频上的人脸打码,可查看我的另一篇博文:Python opencv:人眼/人脸识别并实时打码处理):
PS:关于如何使两个视频拼接边缘平滑过渡,我尚未进行深入研究,如果有懂这方面的朋友,也麻烦在评论区留言,不胜感激!