python图⽚背景前景分离_5⾏Python代码⼀键视频抠图
在视频创作过程中,有时会遇到⼈像抠图的需求,最⼀般的做法是使⽤PR、AE等⼯具将视频中的每⼀帧图像⼿动抠图。这么繁琐的步骤在理⼯男⾯前简直是不可存在的,那么有什么简单的⽅法能快速抠图吗?当然有啦,接下来给⼤家介绍如何使⽤PaddleHub⼀键视频⼈像抠图。
效果展⽰
⾸先展⽰⼀些抠图完毕的⼩⽚段,上⼀秒我还在家⾥的⼩房间,下⼀秒我就出现在了⼟⽿其。
那顺便去看看埃菲尔铁塔呗。 到洛杉矶的海边散散步。 到上海欢乐⾕锻炼锻炼⾝体。 最后到
东京的观景台上看个⽇落 视频效果是不是很逼真呢,⼀天环游世界不是梦哈哈哈…… 其实这些⼈像素材都是在房间⾥拍摄,然后使⽤PaddleHub⼯具库⼀键抠图,最后使⽤PR进⾏后期创作的,接下来介绍下如何操作吧。
这是如何实现的?
关注飞桨的⼩伙伴是否还记得前⼏天推过的别再⽤PS了,我⽤5⾏Python代码就实现了批量抠图,视频⼈像抠图也是类似的,只要把视频的每⼀帧图像所含有的⼈像提取出来,然后加上背景重新合成视频就
可以啦。⼤体的步骤知道了,那接下来开始实践吧。 哦对了,还得有⼀段含有⼈像的素材,⼩伙伴们可以⾃⼰拍摄或者从⽹络搜集。 01 安装必要组建 02 ⼈像抠图制作素材 由于⽬前PaddleHub⼈像抠图模型API的输⼊是单张图像的路径,故需要先将视频的每⼀帧图像分离存储后才能进⾏抠图。当然也可以通过修改模型的源码,将API的输⼊修改成图像输⼊,这样就省去了视频分离存储的步骤,具体的源码可以参考:
aistudio.baidu/aistudio/projectdetail/370260 ,这⾥主要介绍前⼀种⽅法。
2.1 导⼊所有相关模块
import cv2import osimport numpy as npfrom PIL import Imageimport paddlehub as hub
2.2 将视频内图像分离存储
def CutVideo2Image(video_path, img_path):
cap = cv2.VideoCapture(video_path)index = 0while(True):
ret,frame = ad() if ret:
cv2.imwrite(img_path + '%d.jpg' % index, frame)index += 1else:break
该步骤将会把每⼀帧图像保存到本地⽬录。
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}
网页svg图片下载results = module.segmentation(data=input_dict, output_dir=out_path)# Tips:使⽤GPU加速需安装paddlepaddle-gpu# results = module.segmentation(data=inp 该步骤将会把⼈像提取并保存为png⾄本地
2.4 ⽣成绿幕并与⼈像合成
为什么要使⽤绿幕呢,主要是为了后续在视频后期软件⾥⽅便使⽤素材。当然熟悉Python的同学也可
以直接使⽤⼀些Python模块进⾏视频后期。但是在这⾥还是推荐使⽤PR、AE这类专业软件,可以⽅便地对素材进⾏缩放、变速、位置处理、以及添加特效等操
作。更重要的是,可以对素材进⾏调⾊,与新的背景更好地融合。
def init_canvas(width, height, color=(255, 255, 255)):
canvas = np.ones((height, width, 3), dtype="uint8")
canvas[:] = colorreturn canvas# ⽣成绿幕def GetGreenScreen(size, out_path):
canvas = init_canvas(size[0], size[1], color=(0, 255, 0))
cv2.imwrite(out_path, canvas)def BlendImg(fore_image, base_image, output_path):"""
将抠出的⼈物图像换背景
fore_image: 前景图⽚,抠出的⼈物图⽚
base_image: 背景图⽚
"""# 读⼊图⽚
base_image = Image.open(base_image).convert('RGB')
fore_image = Image.open(fore_image).resize(base_image.size)# 图⽚加权合成
scope_map = np.array(fore_image)[:,:,-1] / 255
scope_map = scope_map[:,:,np.newaxis]
scope_map = np.repeat(scope_map, repeats=3, axis=2)
res_image = np.multiply(scope_map, np.array(fore_image)[:,:,:3]) + np.multiply((1-scope_map), np.array(base_image))# 保存图⽚
res_image = Image.fromarray(np.uint8(res_image))
res_image.save(output_path)def BlendHumanImg(in_path, screen_path, out_path):
humanseg_png = [filename for filename in os.listdir(in_path)]for i, img in enumerate(humanseg_png):
img_path = os.path.join(in_path + '%d.png' % (i))
output_path_img = out_path + '%d.png' % i
python入门教程视屏BlendImg(img_path, screen_path, output_path_img)
该步骤完成后将会得到类似这样的绿幕图⽚:
2.5 视频合成
def CompVideo(in_path, out_path, size):
fourcc = cv2.VideoWriter_fourcc(*'mp4v')out = cv2.VideoWriter(out_path,fourcc, 30.0, size) files = os.listdir(in_path)for i in range(len(files)):
img = cv2.imread(in_path + '%d.png' % i)out.write(img) # 保存帧lease()
该步骤完成后即可得到类似下图的⼈体绿幕素材
2.6 主程序
# Config
Video_Path = 'video/0.mp4'
Video_Size = (1920, 1080)
FrameCut_Path = 'video/frame/'
FrameSeg_Path = 'video/frame_seg/'
FrameCom_Path = 'video/frame_com/'
GreenScreen_Path = 'video/green.jpg'
ComOut_Path = 'output.mp4'if __name__ == "__main__":
# 第⼀步:视频->图像if not ists(FrameCut_Path):os.mkdir(FrameCut_Path)
CutVideo2Image(Video_Path, FrameCut_Path)
抽象类自身可以定义成员而接口不可以# 第⼆步:抠图if not ists(FrameSeg_Path):os.mkdir(FrameSeg_Path)
GetHumanSeg(FrameCut_Path, FrameSeg_Path)
网页模板>rank函数使用# 第三步:⽣成绿幕并合成if not ists(GreenScreen_Path):
GetGreenScreen(Video_Size, GreenScreen_Path)if not ists(FrameCom_Path):os.mkdir(FrameCom_Path)
BlendHumanImg(FrameSeg_Path, GreenScreen_Path, FrameCom_Path)
# 第四步:合成视频if not ists(ComOut_Path):
CompVideo(FrameCom_Path, ComOut_Path, Video_Size)
OK,绿幕素材都已经制作完毕,下⼀步就可以导⼊到后期软件内进⾏创作啦,这⾥以PR为例。 03 后期创作 将绿幕素材和背景素材导⼊PR,在绿幕素材上使⽤`超级键`效果,并将主要颜⾊选取为绿幕的颜⾊,即可轻松去除绿幕颜⾊。
再往后的各种骚操作就看各位⼩伙伴的想象⼒啦! 这⾥附上我的作品:[AI⼈像抠图]|百度PaddleHub抠图创意赛[附教程、代码]: www.bilibili/video/BV1cA411b7r2
⽬前存在的问题:
头发、⼿指等细节部分还需要进⼀步完善。
k8s集部署方案⼈体动作幅度⼤导致图像帧模糊,会造成提取失败。
模型的API接⼝有待继续丰富。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论