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

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

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

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

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

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

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

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

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

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

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

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

下面开始写代码啦

首先是视频转图片部分

经过这一步转换,我们约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相关的几行代码取消注释。

值得注意的是,在得到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()

下面就是效果

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

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

python抠出图片人像_Python抠图相关推荐

  1. python抠出图片人像_Python+Paddlehub相片人像抠图精简源码实例

    Python+Paddlehub相片人像抠图实例 无需PS软件,手动制作自己的抠图工具,在只有一张图片,需要细致地抠出人物的情况下,能帮你减少抠图步骤;在有多张图片需要抠的情况下,能直接帮你输出这些人 ...

  2. python 画出决策边界_python 画出使用分类器得到的决策边界

    python 画出使用分类器得到的决策边界 发布时间:2020-09-25 21:10:09 来源:脚本之家 阅读:113 作者:星之空殇 获取数据集,并画图代码如下: import numpy as ...

  3. python批量循环图片识别_python如何进行批量图片处理

    python批量图片处理 本文实例讲述了python批量图片处理.分享给大家供大家参考,具体如下: #!/usr/bin/python #coding:utf-8 import os from PIL ...

  4. python批量循环图片识别_python 实现批量图片识别并翻译

    python 实现批量图片识别并翻译 时间:2020-11-02|栏目:Python|点击: 次 获取待翻译图片文件的方法(此处设置的仅支持.jpg文件): def get_files(): file ...

  5. python爬虫爬图片教程_Python爬虫爬图片需要什么

    Python爬虫爬图片需要什么?下面用两种方法制作批量爬取网络图片的方法: 第一种方法:基于urllib实现 要点如下: 1.url_request = request.Request(url) 2. ...

  6. python画出的图_Python 画出来六维图

    来自维基百科 我们的大脑通常最多能感知三维空间,超过三维就很难想象了.尽管是三维,理解起来也很费劲,所以大多数情况下都使用二维平面. 不过,我们仍然可以绘制出多维空间,今天就来用 Python 的 p ...

  7. 用python制作生日蛋糕图片大全_Python 制作微信全家福,你就是朋友圈最亮的仔!...

    原标题:Python 制作微信全家福,你就是朋友圈最亮的仔! 目录:0 引言 1 环境2 代码实现3 后记 0 引言 前段时间,微信朋友圈开始出现了一种晒照片新形式,微信好友墙,即在一张大图片中展示出 ...

  8. python怎么识别图片验证码_python爬虫20 | 小帅b教你如何使用python识别图片验证码...

    当你在爬取某些网站的时候 对于你的一些频繁请求 对方会阻碍你 常见的方式就是使用验证码 验证码的主要功能 就是区分你是人还是鬼(机器人) 人 想法设法的搞一些手段来对付技术 而 技术又能对付人们的想法 ...

  9. python数据分析水果_超酷炫的事情,使用python识别出图片里的水果

    文章首发于公众号 coolpython 机器学习是计算机视觉已经成为一种热潮,但进入该领域却是一件非常困难的事情,因为这需要非常扎实的数学背景,其所需要的专业知识,即便是大学本科毕业也近乎难以满足. ...

最新文章

  1. 几行 Python 代码实现邮件解析,超赞~
  2. 数论分块 ---- 2020牛客多校第7场H-Dividing[思维+数论分块]
  3. jQuery样式操作
  4. python入门指南 小说-Python 入门指南
  5. CTFshow 命令执行 web63
  6. 三十七、数据泛化(面向属性的归纳)
  7. Android官方开发文档Training系列课程中文版:管理音频播放之音频输出硬件的处理
  8. (90)FPGA十进制计数器设计-面试必问(十四)(第18天)
  9. cmd mysql utf8_MySQL中UTF8编码的数据在cmd下乱码
  10. Python利用Beautiful Soup抓取新闻标题
  11. MATPOWER快速上手及应用实例
  12. 微信网页开发 /JS-SDK说明文档
  13. ROS激光雷达小车自主导航学习(一)(持续更新中)
  14. win10 计算机网络密码,详细教你Win10怎么查看无线网络密码
  15. matlab心电信号的qrs波检测,基于matlab的操作员心电信号QRS波检测及分析
  16. 【PM学习笔记】酸梅干超人 - 零基础学Figma学习笔记
  17. 美颜sdk算法总概——美白
  18. 服务器原装的系统怎么格式化,怎么将云服务器系统格式化
  19. vulntarget-b靶场详细通关记录
  20. 饿了么被上海市市场监督局予以警告处分

热门文章

  1. Spring Boot WebSocket实时监控
  2. Lync 2010升级到Lync 2013 之设定企业联盟!
  3. NoSuchBeanDefinitionException: No bean named 'tDubboServiceImpl' is defined 的解决办法
  4. 测试用例设计方法与举例说明
  5. 基于JavaSwing开发蜘蛛纸牌游戏 课程设计 大作业源码
  6. 【Lecroy示波器使用】
  7. oracle 2019 ocp,2019 OCP简介
  8. 零基础学习ORB-SLAM2特征点提取-从原理到源码【李哈哈】
  9. CentOS7.5 重装 SSH 与 禁止网卡休眠
  10. BlueTooth: 蓝牙Profile的概念和常见种类