当维密天使来到东北(PaddleHub创意赛参赛总结)

当维密天使来到东北(PaddleHub创意赛)

项目使用paddlehub中预训练模型deeplabv3p_xception65_humanseg,抠图维密天使T台秀,与赵本山小品背景融合,最终合成新的视频。 主要涉及到得库有paddlehub、cv2、PIL、!ffmpeg,小白一枚,欢迎交流。

import paddlehub as hub
from PIL import Image
import os
import cv2

视频转图片
利用opencv将视频每一帧转成图片。

def video2jpg(video_file,output_path):
    '''
    将视频文件video_file每一帧转成图片保存到output_path文件夹
    '''
    try:
        os.makedirs(output_path) #创建输出文件夹
    except:
        print()

    #读取视频文件
    cap = cv2.VideoCapture(video_file)
    
    num = 0
    while(True):
        ret,frame = cap.read() 
        if ret:
            cv2.imwrite('%s%d.jpg'%(output_path,num), frame)
            num += 1
        else:
            break
    cap.release()#关闭视频


video_file='video/video1.mp4'
output_path='video/video2jpg/'
video2jpg(video_file,output_path)

人像抠图
装载paddlehub中预训练模型deeplabv3p_xception65_humanseg,将上一步视频分割的每一帧图片的人像抠出来。 这里需要注意一下,如果预训练模型无法自动下载,需要手动安装!hub run deeplabv3p_xception65_humanseg,paddlehub有的模型可以自己下载,有的需要手动安装,也不知道什么原因。 这里有个小坑,有的帧图片是没法识别出人像的,我第一次做的时候就没注意。

!hub run deeplabv3p_xception65_humanseg

def humanseg(images,output_dir):
    '''
    装载paddlehub预训练模型deeplabv3p_xception65_humanseg,实现人像抠图
    '''
    #新建人像抠图后的文件夹路径
    try:
        os.makedirs(output_dir)
    except:
        print ()
    
    #装载模型
    module = hub.Module(name="deeplabv3p_xception65_humanseg")
    #执行模型segmentation命令
    result = module.segmentation(data={"image":images}, output_dir=output_dir)
    # print (result)
    return result


def file_list(listdir):
    '''
    读取文件夹listdir里的序号文件,形成im_list
    '''
    im_list=[]
    files = os.listdir(listdir)
    for i in range(len(files)) :
        im_list.append('%s%d.jpg' %(listdir,i) )
    return im_list


listdir='video/video2jpg/'
im_list=file_list(listdir)
# print (im_list)
output_dir='video/humanseg_out/'
humanseq(im_list,output_dir)

图片融合
利用PIL库的alpha_composite将两图片融合,其中两张图片的size要调整一样大小,我这里背景图片比前景图片小,所以我把背景图片拉伸了。

def alpha_composite(fore_image,base_image,output_dir):
    '''
    将前景图片fore_image与背景图片base_image融合,输出到文件夹output_dir
    '''
 
    base_image_op = Image.open(base_image).convert("RGBA")
    fore_image_op = Image.open(fore_image).convert("RGBA")
    # print (base_image_op)
    # print (fore_image_op)

    #调整照片的size,因为背景图片较小,所以我调整背景图片来适应前景图片
    base_image_op = base_image_op.resize(fore_image_op.size)  
    # base_image = base_image.rotate(90)  #旋转图片

    image_c = Image.alpha_composite(base_image_op, fore_image_op)
    image_c.save(output_dir + fore_image.replace('video/humanseg_out/','') )
    # display(final2)
    return image_c



# 视频转化图片的文件夹
files_v = os.listdir('video/video2jpg/') 
#人像抠图的文件夹
fore_path='video/humanseg_out/'
#背景图片
base_image='video/base_image.png'
#合成图片输出的文件夹
output_dir='video/image_composite/'
try:
    os.makedirs(output_dir)
except:
    print()

for i in range(len(files_v)):
    
    fore_image='%s%d.png'%(fore_path,i)
    try:    
        alpha_composite(fore_image,base_image,output_dir)
    except:
        continue

图片合成视频
利用opencv把合成的图片每一帧合成视频

def png2video(image_dir,out_video):
    '''
    将文件夹image_dir中的每一帧图片合成视频out_video
    '''
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    out = cv2.VideoWriter(out_video,fourcc, 25.0, (1280,720))
    files = os.listdir(image_dir)

    # 视频转化图片的文件夹
    files_v = os.listdir('video/video2jpg/') 

    for i in range(len(files_v)): 
        image='%s%d.png' %(image_dir,i)
        
        try:
            img = cv2.imread(image)
            img = cv2.resize(img,(1280,720))
            out.write(img)#保存帧

        except:
            continue

    out.release()

out_video='video/out_video.mp4'
image_dir='video/image_composite/'

png2video(image_dir,out_video)

注入灵魂!!!
没用声音的视频是没有灵魂的,从video2提取提取音频合成到out_video上,搞定!

# 提取音频
!ffmpeg -i video/video2.mp4 video/video2_m.mp3 -loglevel quiet

# 添加音频合成视频
!ffmpeg -i video/out_video.mp4 -i video/video2_m.mp3  -vcodec copy -acodec copy video/out_video_final.mp4 -loglevel quiet

结果展示:
合成的视频:

PaddleHub创意赛:当维密天使来到东北


)

原素材视频:素材视频

undefined


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值