目录
项目地址
项目介绍
虽然我没玩过LOL,但是却听说过影流之主,这一切还都是因为......
这妖娆的身姿,这鬼畜的动效,阿这......
看得我.....也想来跳一段了,咳咳
据说这个是开了分身特效,但是作为一名合格的炼丹师,当然要自己实现这个效果
特效软件一边去,什么神剪手\pr的统统给我让开,我要自己实现这个效果
现在来分解一下任务:
第一步:把人分割出来
第二步:把人像左右平移,制作出两个分身
效果大致是从
到
的过程
第一步:把人分割出来
就不用这么麻烦啦,paddleseg里面提供了人像分割的模型,而且官方非常贴心的给了样例程序图片视频都有,这个只要配好环境一般来说没有问题
git clone --depth=1 https://github.com/PaddlePaddle/PaddleSeg
cd PaddleSeg && git fetch --unshallow
cd PaddleSeg/contrib/HumanSeg/
第二步:把人像平移制作分身
这一步其实有很多种方案,最开始我是打算用平移卷积做的,后来懒了直接拼吧。下面大致讲一下思路
因为多个人像会重叠,肯定不可以使用直接加和的方式,但受到拼接人像和背景的方法的启发
a.在最后拼接多个人物的图和背景时需要一个多个人物的mask,所以可以将原始的单人mask向左右平移后,在对应元素位置上使用或操作,来得到这样的一张多人mask
b.多个人像拼接的方式采用类似最后拼接的方式
这里我懒一些,建了个很大的array作为底板,然后剪裁作为结果
h, w, _ = frame.shape
newMask = np.zeros([h, w * 3, 3])
newRes = np.zeros([h, w * 3, 3])
newMask[:, w - index : 2 * w - index, :] = np.logical_or(newMask[:, w - index : 2 * w - index, :],img_matting).astype(np.float32)
newMask[:, w + index : 2 * w + index, :] = np.logical_or(newMask[:, w + index : 2 * w + index, :],img_matting).astype(np.float32)
newMask[:, w: 2 * w, :] = np.logical_or(newMask[:, w: 2 * w, :],img_matting).astype(np.float32)
newRes[:,w - index : 2 * w - index, :] = newRes[:,w - index : 2 * w - index, :] * (1 - img_matting) + img_matting * frame
newRes[:,w + index : 2 * w + index, :] = newRes[:,w + index : 2 * w + index, :] * (1 - img_matting) + img_matting * frame
newRes[:,w : 2 * w,:] = newRes[:,w : 2 * w,:] * (1 - img_matting) + img_matting * frame
res = (newRes[:, w : w * 2, :] + (1 - newMask[:, w : w * 2, :]) * frame).astype(np.uint8)
你可以在这里看到效果
飞桨PaddleSeg影流之主效果代码实现效果