任务概述
今天的任务是利用paddlehub实现海贼王op的风格迁移。
风格端图像选择的是极具代表性的梵高的《星月夜》。
最终效果如下:
实现思路
1.截取需要用到的视频片段
2.把视频片段中的每一帧图像提取出来
3.把提取出的图片通过StyleProNet模型进行处理,处理完后保存新的图片
4.把处理后的图片再拼接成视频
具体代码
用到的库:
from PIL import Image
from moviepy.editor import *
import cv2
import paddlehub as hub
首先是截取需要用到的视频片段,完整视频是test.mp4,这里截取前75秒作为所需要用到的数据:
def get_need():
clip = VideoFileClip("test.mp4").subclip(0,75)
clip.write_videofile("need.mp4")
然后利用opencv提取图片:
def video_to_pic():
index = 0
cap = cv2.VideoCapture('./need.mp4')
ret,frame = cap.read()
while ret:
cv2.imwrite('./video2pic/%d.jpg'%index, frame)
index += 1
ret,frame = cap.read()
cap.release()
print('Video cut finish, all %d frame' % index)
这里是利用paddlehub中的stylepro_artistic模型实现图片的风格迁移:
def transfer_pic():
i = 0
stylepro_artistic = hub.Module(name="stylepro_artistic")
pic_path = './video2pic/'
filename_list = os.listdir(pic_path)
filename_list.sort(key=lambda x:int(x[:-4]))
for fname in filename_list:
result = stylepro_artistic.style_transfer(
images=[{
'content': cv2.imread(pic_path+fname),
'styles': [cv2.imread('style.jpg')]
}],visualization=True,output_dir='transfer_result')
print('处理完第',i,'张图片' )
i +=1
最后是把处理后的图片再拼接成视频并添加音乐:
def merge_to_mp4():
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('result.mp4', fourcc, 23.98, (1280, 720))
files = os.listdir('./transfer_result')
files.sort()
for i in files:
img = cv2.imread('./transfer_result/'+i)
out.write(img)#保存帧
out.release()
print('merge ok!')
def add_audio():
video_origin = VideoFileClip('./need.mp4')
audio=video_origin.audio
video_result = VideoFileClip('./result.mp4')
video_result = video_result.set_audio(audio)
video_result.write_videofile('final.mp4')
print('done!')
注意这里的23.98和(1280, 720)分别是fps和图片的尺寸,可以事先用如下代码获取:
def get_information():
img = Image.open('./video2pic/0.jpg')
print(img.size[0], img.size[1])
video= cv2.VideoCapture('./need.mp4')
fps = video.get(cv2.CAP_PROP_FPS)
print(fps)
frameCount = video.get(cv2.CAP_PROP_FRAME_COUNT)
print(frameCount)