Python opencv:实现与自己同框对话的视频特效

做视频特效时常用一种画面拼接的手法,可以实现在一个场景中同一个人与自己同框做出不同动作的效果。

我们知道,从视频到图像,从图像到像素,这一层层深入下来,我们只要能操纵每一个像素点的值,就可以实现任意想要的移花接木效果。

下面,来尝试使用Python+opencv实现自己与自己同框的视频特效。

一、素材准备

要求同一个主体(人或动物、物体均可)在同一场景的不同位置拍摄两段视频。为了方便后切裁切,最好在镜头左端面向右端拍摄一段,然后在镜头右端面向左端拍另外一段。

二、特效处理思路

  1. 分别读取两个视频中的图像帧;
  2. 两帧图像分别进行裁切,分别保留每段视频的主体,切记在拼接的位置(左视频从右端拼接,右视频从左端拼接)对主体本身做了切割,这样效果出来很差;
  3. 将裁切好的两帧图像进行拼接,并调整了图像亮度,调整方法为:先将图像从BGR模式转为HSV模式,调节V(明度)值后,再转回BGR;
  4. 在指定帧上添加文字。

三、代码

# -*- 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:人眼/人脸识别并实时打码处理):

Python opencv:实现与自己同框对话的视频特效_第1张图片

 

 

PS:关于如何使两个视频拼接边缘平滑过渡,我尚未进行深入研究,如果有懂这方面的朋友,也麻烦在评论区留言,不胜感激!

你可能感兴趣的:(Python,opencv)