欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

5 行 Python 代码实现一键视频抠像

最编程 2024-04-12 07:29:03
...
在视频创作过程中,有时会遇到人像抠图的需求,最一般的做法是使用PR、AE等工具将视频中的每一帧图像手动抠图。这么繁琐的步骤在理工男面前简直是不可存在的,那么有什么简单的方法能快速抠图吗?当然有啦,接下来给大家介绍如何使用PaddleHub一键视频人像抠图。


效果展示




首先展示一些抠图完毕的小片段,上一秒我还在家里的小房间,下一秒我就出现在了土耳其。



那顺便去看看埃菲尔铁塔呗。


到洛杉矶的海边散散步。


到上海欢乐谷锻炼锻炼身体。


最后到东京的观景台上看个日落


视频效果是不是很逼真呢,一天环游世界不是梦哈哈哈……

其实这些人像素材都是在房间里拍摄,然后使用PaddleHub工具库一键抠图,最后使用PR进行后期创作的,接下来介绍下如何操作吧。


这是如何实现的?




关注飞桨的小伙伴是否还记得前几天推过的别再用PS了,我用5行Python代码就实现了批量抠图,视频人像抠图也是类似的,只要把视频的每一帧图像所含有的人像提取出来,然后加上背景重新合成视频就可以啦。大体的步骤知道了,那接下来开始实践吧。
哦对了,还得有一段含有人像的素材,小伙伴们可以自己拍摄或者从网络搜集。

01
安装必要组建


需要安装的是飞桨框架和PaddleHub工具库,安装步骤可以参考别再用PS了,我用5行Python代码就实现了批量抠图。或者直接阅读原文进入飞桨官网查看安装步骤。

02
人像抠图制作素材

由于目前PaddleHub人像抠图模型API的输入是单张图像的路径,故需要先将视频的每一帧图像分离存储后才能进行抠图。当然也可以通过修改模型的源码,将API的输入修改成图像输入,这样就省去了视频分离存储的步骤,具体的源码可以参考:
https://aistudio.baidu.com/aistudio/projectdetail/370260 ,这里主要介绍前一种方法。

2.1 导入所有相关模块



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


2.2 将视频内图像分离存储



    
    
    
def CutVideo2Image(video_path, img_path):
    cap = cv2.VideoCapture(video_path)
     index =  0
     while(True):
        ret,frame = cap.read() 
         if ret:
            cv2.imwrite(img_path +  '%d.jpg' %  index, frame)
             index +=  1
         else:
             break
    cap.release()
     print( 'Video cut finish, all %d frame' %  index)
该步骤将会把每一帧图像保存到本地目录。

2.3 导入模型进行人像抠图



    
    
    
def GetHumanSeg(frame_path, out_path):
     # 加载模型
    module = hub.Module(name= "deeplabv3p_xception65_humanseg")
     # 配置
    test_img_path = [os.path.join(frame_path, fname)  for fname  in os.listdir(in_path)]
    input_dict = { "image": test_img_path}

    results = module.segmentation(data=input_dict, output_dir=out_path)
     # Tips:使用GPU加速需安装paddlepaddle-gpu
     # results = module.segmentation(data=input_dict, use_gpu = gpu, batch_size = 10,output_dir=out_path)
该步骤将会把人像提取并保存为png至本地

2.4 生成绿幕并与人像合成


为什么要使用绿幕呢,主要是为了后续在视频后期软件里方便使用素材。当然熟悉Python的同学也可以直接使用一些Python模块进行视频后期。但是在这里还是推荐使用PR、AE这类专业软件,可以方便地对素材进行缩放、变速、位置处理、以及添加特效等操作。更重要的是,可以对素材进行调色,与新的背景更好地融合。

    
    
    

     
       
  
      
      
      
def init_canvas(width, height, color=(255255255)):
    canvas = np.ones((height, width, 3), dtype="uint8")
    canvas[:] = color
    return canvas
# 生成绿幕

def GetGreenScreen(size, out_path):
    canvas = init_canvas(size[0], size[1], color=(02550))
    cv2.imwrite(out_path, canvas)

def BlendImg(fore_image, base_image, output_path):

上一篇: 碰撞检测的经典解决方案

下一篇: 领导让我用手机拍摄团建活动的视频,现场很乱,人特别多,该怎么拍?