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

作者:小小杨树 时间:2023-06-11 06:58:30 

引言

近期网上这位卖蜂蜜的小伙鬼畜挺火的,大家质疑背景造假,这里我就带着大家实现“背景造假”(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()

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

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

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

自定义图像背景板替换

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

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

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

3. 读取视频

4. 获取视频帧

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

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

7. 输出视频画面

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

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

背景图结合人物图:

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

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

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

来源:https://juejin.cn/post/7124526055389397006

标签:python,视频背景,替换
0
投稿

猜你喜欢

  • 有时用户并不需要引导

    2009-07-17 18:48:00
  • Python jieba 中文分词与词频统计的操作

    2022-08-31 17:08:14
  • IE9报“DOM Exception: INVALID_CHARACTER_ERR (5)”错误的原因及解决办法

    2011-09-01 19:11:07
  • python实现二维插值的三维显示

    2022-05-28 14:17:58
  • Python列表生成器的循环技巧分享

    2023-10-06 21:24:28
  • Python爬虫基于lxml解决数据编码乱码问题

    2021-09-11 23:48:44
  • TensorFlow实现模型评估

    2023-10-15 22:36:51
  • Python学习之字符串常用操作详解

    2022-07-14 18:54:48
  • mac安装python3后使用pip和pip3的区别说明

    2021-01-06 21:23:15
  • Windows中安装使用Virtualenv来创建独立Python环境

    2023-10-21 19:44:52
  • Python中单线程、多线程和多进程的效率对比实验实例

    2022-12-01 09:25:55
  • 对Python 语音识别框架详解

    2023-09-22 01:32:30
  • 解析Pytorch中的torch.gather()函数

    2023-01-29 23:44:40
  • Mysql中二进制日志操作方法说明

    2024-01-25 23:08:28
  • pytorch掉坑记录:model.eval的作用说明

    2023-01-07 11:52:18
  • Python实现自动化发送邮件

    2023-12-07 14:39:58
  • python如何将两张图片生成为全景图片

    2021-08-03 23:42:26
  • SQLSERVER2008中CTE的Split与CLR的性能比较

    2024-01-28 06:56:04
  • Python类的继承和多态代码详解

    2022-01-20 14:16:39
  • 网页设计进阶之六-- 守住那些不能丢的东西

    2008-06-12 13:06:00
  • asp之家 网络编程 m.aspxhome.com