热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python人物视频背景替换实现虚拟空间穿梭

这篇文章主要为大家介绍了python实现人物视频背景替换示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

近期网上这位卖蜂蜜的小伙鬼畜挺火的,大家质疑背景造假,这里我就带着大家实现“背景造假”(PS:原视频小伙是在真实场景拍摄的)

准备工作

在实现该功能之前,我们需要准备好python==3.7 然后执行:

pip install mediapipe

方案一: PC端可以选择外界摄像头或者连接网络摄像头,最好挑选一个纯属的背景板作为视频画面背景(这样有利于任务分割);

方案二: 网上下载有人物活动的视频,然后用下载的视频替代连接摄像头。

到这里我们基础物件已经搭建好了,本实验代码选择方案二,对下载视频分析,其shape=(740,640,3)。接下来我将带领大家实现三个版本的背景替换

纯RGB背景替换

基础板:将人物提取出来,替换成设定好的纯色背景(可以通过RGB设定)。其基本流程如下:

1. 输入视频

2. 获取视频帧

3. 提取帧内人物图像

4. 设定背景RGB值

5. 创建同视频帧同shape的RGB图像

6. 结合背景图与人物图

7. 输出结合图

示例demo:

import cv2
import mediapipe as mp
import numpy as np
mp_drawing = mp.solutions.drawing_utils
mp_selfie_segmentation = mp.solutions.selfie_segmentation
BG_COLOR = (0, 0, 225) # red
cap = cv2.VideoCapture('111.mp4')
with mp_selfie_segmentation.SelfieSegmentation(
    model_selection=0) as selfie_segmentation:
  bg_image = None
  while cap.isOpened():
    success, image = cap.read()
    if not success:
      break
    image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
    image.flags.writeable = False
    results = selfie_segmentation.process(image)
    image.flags.writeable = True
    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
    cOndition= np.stack(
      (results.segmentation_mask,) * 3, axis=-1) > 0.8
    if bg_image is None:
      bg_image = np.zeros(image.shape, dtype=np.uint8)
      bg_image[:] = BG_COLOR
      print(bg_image.shape)
    output_image = np.where(condition, image, bg_image)
    cv2.imshow('MediaPipe Selfie Segmentation', output_image)
    if cv2.waitKey(5) & 0xFF == 27:
      break
cap.release()

原视频节选帧&替换背景帧:

自定义图像背景板替换

由于我们已知图像的shape,我们可以在网上挑选自己喜欢的背景图,然后调整背景图的shape,使其与视频图像保持一致。整体流程图下:

1. 下载选择喜欢的背景图像

2. 调整下载图像的shape=(740,604,3)

3. 读取视频

4. 获取视频帧

5. 获取视频帧内人物图像

6. 结合背景图和人物图像

7. 输出视频画面

修改图像大小并进行50%缩放后的背景图:

背景图结合人物图:

这里我的背景图选择的有些单调,也不是那么适合,望读者见谅! 代码部分修改:

bg_image = cv2.imread("BBB.jpg")

以上就是python实现人物视频背景替换的详细内容,更多关于python视频背景替换的资料请关注其它相关文章!


推荐阅读
  • codeproject 调试技巧 学习笔记
    http:www.codeproject.comKBtracemytracer.aspxAsimplesolutiontoseetheinsideofyourcodeKEYWORD ... [详细]
  • jeecgboot多表联合查询
    在数据大屏中需要多表联合查询的业务处理,而Jeecgboot提供的生成工具只能满足最普遍的简单代码,mybatis-plus框架使用的QueryWrapper显然无法满足多表联合查 ... [详细]
  • Java课程设计/大作业合集
    原标题:Java课程设计/大作业合集目录前言一、需求描述二、功能介绍三、具体实现 ... [详细]
  • 在Dota2AI开发(一)环境配置中介绍了如何搭建Dota2AI的开发环境,在这篇文章中,主要介绍Dota2中AI的常规控制方式,并介绍如何在人机比赛中配置一个裸跳刀的Sven。常用指令 ... [详细]
  • spring  中的IOC 操作 Bean 管理(bean 生命周期)
    1、生命周期(1)从对象创建到对象销毁的过程2、bean生命周期(1)通过构造器创建bean实例(无参数构造& ... [详细]
  • 一、数据库并发测试的必要性1、与数据库连接的服务程序采用多线程同时开启多个数据库连接;2、与数据库连接的服务程序单线程,但是同时开启多套服务程序 ... [详细]
  • 准备进入网络世界_进入全球最大的运动资产市场
    准备进入网络世界Rokoko’sMotionLibraryprovidesUnityuserstheabilitytopreviewcharacteranimationsandpu ... [详细]
  • Apache Drill
    2019独角兽企业重金招聘Python工程师标准WhyDrillTop10ReasonstoUseDrill1.GetstartedinminutesIttakesacoup ... [详细]
  • mysql 同步机制_MySQL主从同步原理
    mysql主从同步定义主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余 ... [详细]
  • <selectnameBigClassName><optionvalue>请选择一级分类& ... [详细]
  • Linux系统编程(四)——signal信号处理
    目录0x01信号0x02信号相关的函数一、kill函数二、alarm()函数三、setitimer()四、signal()0x03信号集一、信号集的处理过程​编辑二、 ... [详细]
  • 加密要用到Crypto安装包pipinstallCrypto新建两个模块rsautils.py,rsatest.py直接上代码,rsautils.py#!usrbinenv ... [详细]
  • android 源码官方下载,Android源码下载
    说在前面的话win系统的笔记本过年回来就没有带回北京。最近打算看看Android源码,所以需要在mac中从新下载。从官网下载下载Android源码首先想到的就是官网按 ... [详细]
  • 关于模块的博文在这里:https:blog.csdn.netsmllyyarticledetails40824491一)关于invite会话参考博文内容摘录 ... [详细]
  • Java程序包不存在问题的解决办法
    最近工作中遇到个问题,代码中没有报错,启动时报错,但是程序包不存在,这篇文章主要给大家介绍了关于Java程序包不存在问题的解决办法,需要的朋友可以参考下 ... [详细]
author-avatar
磊仔2502898265
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有