最近参加超越杯发生了一段小插曲,主办方要求提交白底的团队介绍VCR,然而之前没有注意到这点,就找了个风景优美的地方拍摄,直到截止前才发现大事不妙。
此时自然而然地就想到抠图了!然而这次的视频背景花里胡哨。
我询问了各路图像大佬,得到的回复往往是几个paper标题,或者几个不明觉厉的词汇,至于直接能拿来用解决燃眉之急的,实在没有。。。
于是我决定从问题本质出发,视频抠图最直接的思路不外乎三步走:
1.从视频转换为一帧帧的图像
2.将每帧图像分别进行人像分离
3.将处理后的每帧图像合并回新视频
其中13两步显然是没有难度的,只要找到对应的视频、图像库。
第2步就是难点、瓶颈所在了。
市面上的人像分割api众多,例如百度的aip、旷视的Face++、国外火爆的remove.bg。
我还是选择了 络稳定,每日允许调用50000次的百度aip,倘若每秒25帧,意味着可以每日处理长度为33.33分钟的视频!
当然如果有离线版api(可以推荐我一下)或者自己训练好的神经 络,肯定是更佳的选择。
下面开始写代码啦
首先是视频转图片部分
经过这一步转换,我们约2分钟的测试视频被神奇地转为
这1819张独立的图片
需要一定的存储空间哦~
接下来,关键的一步到了!对每张图片进行抠图处理。
只需要调整numimg值为图片总数,就能自动进行抠图啦!
可以在调用do_split_figure函数时指定结果图片的背景色,默认是白底。
如果想看抠图的mask结果,可以将保存mask_img相关的几行代码取消注释。
人像分割得到的mask
值得注意的是,在得到0/1结果矩阵后,需要进行边缘羽化处理,这里我用了简单的cv2.blur,大家如果有更好的方法可以告诉我。
然后就是
sum = labelimg * ori_img + (all_one – labelimg)*color_new
以blur之后的矩阵为比例,将前景色和背景色填上去啦!
最后,激动人心的时刻到了!只需要再将这些图片转回视频就行了。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!