Python实现视频人物背景替换:从纯色到自定义图像
本文详细介绍如何利用Python结合MediaPipe和OpenCV实现视频背景替换功能。文章涵盖环境配置、两种数据采集方案(摄像头与预录视频),并分步讲解纯RGB背景替换及自定义图像背景替换的实现流程。通过具体代码示例,展示如何提取人物主体并合成新背景,适用于虚拟空间构建或视频特效制作。
引言
近期网络上关于某位销售蜂蜜的短视频博主因背景疑似造假而引发热议,实际上该视频是在真实场景中拍摄的。本文旨在通过技术手段复现这种“背景替换”效果,帮助读者理解其背后的实现逻辑。
准备工作
在开始开发之前,请确保系统已安装 python==3.7 版本,并执行以下命令安装必要的依赖库:
pip install mediapipe
方案一:若使用PC端,可连接外接摄像头或网络摄像头。建议背景为纯色背景板,这有助于提升图像分割的精度。
方案二:直接下载包含人物活动的视频素材,用该视频文件替代实时摄像头输入进行后续处理。
基础环境搭建完成后,本实验代码采用方案二,即对下载的视频进行分析,其视频帧形状为(740,640,3)。接下来将演示三种不同版本的背景替换实现方式。
纯RGB背景替换
基础实现:将视频中的人物主体提取出来,并替换为指定的纯色背景(可通过RGB数值设定)。基本处理流程如下:
1. 读取输入视频文件
2. 逐帧获取视频画面
3. 对每一帧进行人物图像提取
4. 设定目标背景的RGB颜色值
5. 创建与视频帧形状相同的空白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()
原视频节选帧&替换背景帧:


自定义图像背景板替换
由于已知视频帧的形状,我们可以从网络选取喜欢的背景图片,并调整其形状以匹配视频图像尺寸。整体处理流程图如下:
1. 下载并选定喜欢的背景图像
2. 调整背景图像的形状为=(740,604,3)
3. 读取待处理的视频文件
4. 逐帧获取视频画面
5. 对每一帧进行人物图像提取
6. 将提取的人物图像与自定义背景图进行合成
7. 输出最终的视频画面
修改图像大小并进行50%缩放后的背景图:

背景图结合人物图:

此处选择的背景图风格较为单一,可能并非最佳视觉效果,敬请谅解。代码部分的修改如下:
bg_image = cv2.imread("BBB.jpg")以上就是python实现人物视频背景替换的详细内容,更多关于python视频背景替换的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













