使用百度PaddleHub制作抠图视频

使用百度PaddleHub制作抠图视频

  • 目标:制作在太空中跳街舞的视频

目标:制作在太空中跳街舞的视频

import paddlehub as hub
from PIL import Image
import os
import cv2
import matplotlib.pyplot as plt   # 显示图片
import matplotlib.image as mpimg  # 读取图片
import numpy as np

第一步:

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/1.mp4'
output_path='video/video2jpg/'
video2jpg(video_file,output_path)

!ls video

第二步:

%matplotlib inline

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


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)
#执行批量抠图程序
output_dir='video//'
#humanseg(im_list,output_dir)
module = hub.Module(name="deeplabv3p_xception65_humanseg")
print(im_list[2])
result = module.segmentation(data={"image":[im_list[0]]}, output_dir=output_dir)
print(result)
print(np.min(result[0]['data']))
print(np.max(result[0]['data']))
plt.imshow(result[0]['data'].astype(np.uint8)) #把图片画在画板上
plt.show()   # 显示画板

这一帧的效果好像不是特别好
使用百度PaddleHub制作抠图视频_第1张图片
换了一帧,效果好了很多

使用百度PaddleHub制作抠图视频_第2张图片

第三步:

im = Image.open(im_list[0])
im = np.array(im)
result[0]['data']=np.maximum(result[0]['data'], 0)
alpha = result[0]['data'].astype(np.uint8)
im[:,:,0][alpha==0]=255
im[:,:,1][alpha==0]=255
im[:,:,2][alpha==0]=255
plt.imshow(im)
plt.show()
im = Image.fromarray(im)
basename = os.path.basename(im_list[0])
im.save("{}{}.png".format(output_dir, basename))

第四步:

module = hub.Module(name="deeplabv3p_xception65_humanseg")
for im_path in im_list:
    result = module.segmentation(data={"image":[im_path]}, output_dir=output_dir)
    im = Image.open(im_path)
    im = np.array(im)
    result[0]['data']=np.maximum(result[0]['data'], 0)
    alpha = result[0]['data'].astype(np.uint8)
    im[:,:,0][alpha==0]=255
    im[:,:,1][alpha==0]=255
    im[:,:,2][alpha==0]=255
    im = Image.fromarray(im)
    basename = os.path.basename(im_path).split('.')[0]
    im.save("{}{}.jpg".format(output_dir, basename))

大功告成啦!
第五步:

!ls video/humanseg_out

你可能感兴趣的:(使用百度PaddleHub制作抠图视频)