最近参加超越杯发生了一段小插曲,主办方要求提交白底的团队介绍VCR,然而之前没有注意到这点,就找了个风景优美的地方拍摄,直到截止前才发现大事不妙。

此时自然而然地就想到抠图了!然而这次的视频背景花里胡哨。

我询问了各路图像大佬,得到的回复往往是几个paper标题,或者几个不明觉厉的词汇,至于直接能拿来用解决燃眉之急的,实在没有。。。

于是我决定从问题本质出发,视频抠图最直接的思路不外乎三步走:

1.从视频转换为一帧帧的图像

2.将每帧图像分别进行人像分离

3.将处理后的每帧图像合并回新视频

其中13两步显然是没有难度的,只要找到对应的视频、图像库。

第2步就是难点、瓶颈所在了。

市面上的人像分割api众多,例如百度的aip、旷视的Face++、国外火爆的remove.bg。

我还是选择了网络稳定,每日允许调用50000次的百度aip,倘若每秒25帧,意味着可以每日处理长度为33.33分钟的视频!

当然如果有离线版api(可以推荐我一下)或者自己训练好的神经网络,肯定是更佳的选择。

下面开始写代码啦

首先是视频转图片部分

import cv2

vc = cv2.VideoCapture("TestVideo.mp4")

c = 1

if vc.isOpened():

rval, frame = vc.read()

else:

rval = False

while rval:

rval, frame = vc.read()

cv2.imwrite('imgs\\' + str(c) + '.jpg', frame) # 需要先存在这个文件夹

c = c + 1

cv2.waitKey(1)

vc.release()

经过这一步转换,我们约2分钟的测试视频被神奇地转为

这1819张独立的图片

需要一定地存储空间哦~

接下来,关键的一步到了!对每张图片进行抠图处理。

import cv2

import base64

import numpy as np

from aip import AipBodyAnalysis

def do_split_figure(i, color_new = [255, 255, 255]):

imgfile = 'imgs\\' + str(i) + '.jpg'

ori_img = cv2.imread(imgfile)

height, width, _ = ori_img.shape

with open(imgfile, 'rb') as fp:

img_info = fp.read()

seg_res = client.bodySeg(img_info)

labelmap = base64.b64decode(seg_res['labelmap'])

nparr = np.fromstring(labelmap, np.uint8)

labelimg = cv2.imdecode(nparr, 1) # 不是0 0 0就是1 1 1的抠图结果矩阵

labelimg = cv2.resize(labelimg, (width, height), interpolation=cv2.INTER_NEAREST)

all_one = np.where(labelimg > -1, 1, labelimg)

#mask_img = np.where(labelimg == 1, 255, labelimg) # 如果是人的区域rgb都弄成255,否则都是0显示黑色

# maskfile = imgfile.replace('.jpg', '_mask.png')

# cv2.imwrite(maskfile, mask_img)

labelimg = cv2.blur(labelimg, (9, 9))

sum = labelimg * ori_img + (all_one - labelimg)*color_new

res_imgfile = 'imgsres\\' + str(i) + '.jpg'

result = cv2.resize(sum, None, fx=1, fy=1, interpolation=cv2.INTER_NEAREST)

cv2.imwrite(res_imgfile, result)

print(imgfile, 'Done.')

pass

# 在百度云中申请,每天各接口有 50000 次调用限制.

APP_ID = '****'

API_KEY = '****'

SECRET_KEY = '****' # '****' 这个key不能给别人看

client = AipBodyAnalysis(APP_ID, API_KEY, SECRET_KEY)

num_img = 1820 # 这个先手动写吧

i_start = 1 # 262

for i in range(num_img):

if i >= i_start - 1:

while True:

bfinish = True

try:

do_split_figure(i + 1)

except:

bfinish = False

if bfinish:

break

只需要调整numimg值为图片总数,就能自动进行抠图啦!

可以在调用do_split_figure函数时指定结果图片的背景色,默认是白底。

如果想看抠图的mask结果,可以将保存mask_img相关的几行代码取消注释。人像分割得到的mask

值得注意的是,在得到0/1结果矩阵后,需要进行边缘羽化处理,这里我用了简单的cv2.blur,大家如果有更好的方法可以告诉我。

然后就是

sum = labelimg * ori_img + (all_one - labelimg)*color_new

以blur之后的矩阵为比例,将前景色和背景色填上去啦!

最后,激动人心的时刻到了!只需要再将这些图片转回视频就行了。

import cv2

from cv2 import VideoWriter, VideoWriter_fourcc, imread, resize

import os

img_root = "imgsres\\"

# Edit each frame's appearing time!

fps = 25

fourcc = VideoWriter_fourcc(*"MJPG")

# 分辨率自己看着写

videoWriter = cv2.VideoWriter("TestVideoRes.avi", fourcc, fps, (1920, 1080))

im_names = os.listdir(img_root)

for im_name in range(len(im_names)):

frame = cv2.imread(img_root + str(im_name+1) + '.jpg')

print(im_name)

videoWriter.write(frame)

videoWriter.release()

我们来看一下效果吧。。。

https://www.zhihu.com/video/1103039471712329728

不能说有多棒,但思路就是这样的,如果要改进可以从选择更好的人像分割API或者使用本地训练好的神经网络入手。

视频帧之间也是有联系的,如果追求更好的效果也应该考虑进去,不过就比较专业了。

python 抠图白幕_巧用Python,视频抠图无需绿幕相关推荐

  1. python风格变换图片_巧用python实现图片转换成素描和漫画格式

    [相关学习推荐:python视频教程] 本文实例为大家分享了python实现图片转换成素描和漫画格式的具体代码,供大家参考,具体内容如下 原图 图片转换后的成果 源码# -*- coding: utf ...

  2. python画动物代码_如何用python画简单的动物_后端开发

    python3.x完全兼容python2.x吗?_后端开发 可以说是完全不兼容.相对于Python的早期版本,Python3是一个较大的升级,为了不带入过多的累赘,Python 3.0在设计的时候没有 ...

  3. python变量定义大全_详解python变量与数据类型

    这篇文章我们学习 Python 变量与数据类型 变量 变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念,变量可以通过变量名访问.在 Python 中 变量命名规定,必须是大小写英文,数字 ...

  4. 做python的心得体会_实训python的心得体会

    如何学习Python的一些总结 C++.Java乃至C#都可以看做是同一类型的语言:C++还算灵活,但纷繁复杂的语法使得生产效率低下,Java提高了生产效率,却损失了灵活性;C#算是在生产效率和灵活性 ...

  5. python积木式编程_实例讲解python函数式编程

    函数式编程是使用一系列函数去解决问题,按照一般编程思维,面对问题时我们的思考方式是"怎么干",而函数函数式编程的思考方式是我要"干什么". 至于函数式编程的特点 ...

  6. python怎么求指数_求指数 python

    softmax用于多分类过程中最后一层,将多个神经元的输出,映射到(0, 1)区间内,可以看成概率来理解,从而来进行多分类! softmax函数如下: 更形象的如下图表示: softmax 直白来说就 ...

  7. python实现数据可视化_使用Matplotib python实现数据可视化

    python实现数据可视化 I Feel: 我觉得: In today's digital world data has become as important as air. Machines &a ...

  8. python适用于哪些芯片_五年Python三大秘诀!日常生活不可或缺的秘密武器

    EDA365欢迎您登录! 您需要 登录 才可以下载或查看,没有帐号?注册 x 本帖最后由 Ber_thaw99 于 2020-12-28 14:07 编辑' P& t5 n# [5 J) Y& ...

  9. python展开函数方法_逐步展开Python详细教学—Python语法

    Python语法–在Python世界迈出第一步 我们已经拥有了许多的编程语言,而且都有自己的特色,但是一种语言的独特之处在于它的特性.最终,是它的特点让它被选中或通过项目.因此,在开始更深入的Pyth ...

最新文章

  1. idea的tomcat配置文件在哪里修改_MyBatis配置文件详解
  2. 构建百万访问量电子商务网站之LVS负载均衡(前端四层负载均衡器)[连载之电子商务系统架构]...
  3. 顺序、二分查找文本数据
  4. mysql find()方法_Mysql find_in_set()函数使用方法
  5. SpringMVC,MyBatis项目中兼容Oracle和MySql的解决方案及其项目环境搭建配置、web项目中的单元测试写法、HttpClient调用post请求等案例
  6. 关于重复接收NSNotificationCenter发送的通知的问题
  7. macpro台式计算机,Mac Pro正式上架 真的可以用来刨土豆丝
  8. zookeeper一键启动关闭JAVA_HOME在PATH中找不到报错踩坑记
  9. (17)Verilog HDL结构:always语句
  10. 如何用python分析大数据_Twitter数据挖掘:如何使用Python分析大数据
  11. checkValidity()验证输入信息合法性,自定义错误提示信息方法及误区
  12. 单用户模式 启动 mysql_单用户模式连接以及故障排除
  13. IDEA 修改 jdk 版本
  14. LeetCode之寻找峰值
  15. 世界上不同国家有不同的写日期的习惯。比如美国人习惯写成“月-日-年”,而中国人习惯写成“年-月-日”。下面请你写个程序,自动把读入的美国格式的日期改写成中国习惯的日期。
  16. 主流量化交易策略:统计套利交易策略
  17. Cadence导出gds文件
  18. 解决ROS常遇到的Couldn’t find executable named报错
  19. 最新PHP对接微信支付,发起商家转账API,商家转账到零钱
  20. Linux命令 - 覆盖 > 和 追加 >>

热门文章

  1. Codeblocks的安装与配置
  2. java/php/net/python北信学生成绩预警平台设计
  3. 如何处理linux恶意程序
  4. 电器类目主图设计(洗衣机主图)
  5. 基于html+css+js+jquery的购物页面设计
  6. Airtest笔记(一)
  7. 各种品牌的Andr​​oid智能手机在Aliexpress.comstore833807
  8. 简洁商务风公司产品介绍通用PPT模板
  9. EDB数据库创建流程指南
  10. 通俗易懂的基金理财(小白)