视频魔法:用Python和OpenCV实现动态背景的画中画效果

在本文中,我们将通过一个详细的Python脚本,使用OpenCV库来为视频添加动态背景。这个脚本将指导你如何读取两个视频文件,一个作为前景,另一个作为背景,并将它们合成一个视频,其中前景视频的特定区域将显示背景视频的内容。

在下面的视频上加入背景动态的画中画。

代码解析与注释

python 复制代码
# 视频文件路径
input_video_path = 'sc/input_video.mp4'  # 输入视频文件路径
output_video_path = 'output_video_bg03.mp4'  # 输出视频文件路径
background_video_path = 'sc/bg_03b.mp4'  # MP4视频背景文件路径

# 背景透明度(0.0 完全透明,1.0 完全不透明)
background_opacity = 0.6

# 背景视频的最大帧数(如果需要截断背景视频)
max_background_frames = 1000

# 读取视频文件
cap = cv2.VideoCapture(input_video_path)  # 读取前景视频
background_cap = cv2.VideoCapture(background_video_path)  # 读取背景视频

# 获取视频帧的尺寸
ret, frame = cap.read()  # 读取第一帧
if not ret:
    print("无法读取视频文件")
    raise Exception("无法读取视频文件")  # 如果无法读取,抛出异常

height, width = frame.shape[:2]  # 获取帧的高和宽

# 定义黑色实心矩形的尺寸变量
top_bar_height = int(height * 0.30)  # 顶部黑色实心矩形的高度设置为视频总高度的30%
bottom_bar_height = int(height * 0.15)  # 底部黑色实心矩形的高度设置为视频总高度的15%

# 定义蒙版的位置和大小
mask_top_margin = top_bar_height  # 蒙版顶部距离
mask_bottom_margin = bottom_bar_height  # 蒙版底部距离
mask_height = height - mask_top_margin - mask_bottom_margin  # 蒙版高度
mask_width = width  # 蒙版宽度
mask_x = 0  # 蒙版中心x坐标
mask_y = mask_top_margin  # 蒙版中心y坐标

# 创建蒙版
mask = np.zeros((height, width, 3), dtype=np.uint8)  # 创建一个全黑的蒙版
cv2.rectangle(mask, (mask_x, mask_y), (mask_x + mask_width, mask_y + mask_height), (255, 255, 255), -1)  # 在蒙版中绘制一个白色矩形

# 定义视频写入器
fourcc = cv2.VideoWriter_fourcc(*'mp4v')  # 定义视频编码格式
out = cv2.VideoWriter(output_video_path, fourcc, 20.0, (width, height))  # 创建视频写入对象

# 背景视频帧计数器
background_frame_index = 0

# 遍历视频帧
while cap.isOpened():
    ret, frame = cap.read()  # 读取前景视频的当前帧
    if not ret:
        break  # 如果读取结束,跳出循环

    # 在视频帧顶部绘制黑色实心矩形
    cv2.rectangle(frame, (0, 0), (width, top_bar_height), (0, 0, 0), -1)
    # 在视频帧底部绘制黑色实心矩形
    cv2.rectangle(frame, (0, height - bottom_bar_height), (width, height), (0, 0, 0), -1)
    # 将蒙版应用到帧上
    masked_frame = cv2.bitwise_and(frame, mask)
    # 读取背景视频的当前帧
    background_ret, background_frame = background_cap.read()
    if not background_ret or background_frame_index >= max_background_frames:
        # 如果背景视频读取失败或达到最大帧数,重新开始背景视频
        background_cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
        background_frame_index = 0
        background_ret, background_frame = background_cap.read()

    # 确保背景帧的尺寸与视频帧匹配
    background_frame = cv2.resize(background_frame, (width, height))
    # 调整背景帧的透明度
    background_frame = background_frame.astype(float) * background_opacity
    background_frame = np.clip(background_frame, 0, 255).astype(np.uint8)

    # 创建反向蒙版
    inv_mask = cv2.bitwise_not(mask)
    # 将背景帧与蒙版的反向进行混合
    masked_background = cv2.bitwise_and(background_frame, inv_mask)
    # 将两个混合结果相加
    result_frame = cv2.add(masked_frame, masked_background)
    # 保存帧
    out.write(result_frame)
    # 更新背景视频帧索引
    background_frame_index += 1

# 释放资源
cap.release()
background_cap.release()
out.release()
cv2.destroyAllWindows()

##注意

以上是通过cv2经测式,如何视频文件大于10M时运行较慢

结尾与思考

通过上述代码,我们成功地为一个视频添加了动态背景,同时在视频的顶部和底部添加了黑色实心矩形。这个技术可以广泛应用于视频编辑和特效制作中,例如制作新闻节目的背景、电影特效或者增强视频的视觉效果。

这个项目也展示了Python和OpenCV在视频处理方面的强大能力。通过简单的代码,我们就能够实现复杂的视频合成效果。这不仅为视频制作人员提供了便利,也为爱好者提供了一个学习和实验的平台。

在未来,我们可以探索更多的视频处理技术,比如使用深度学习来自动替换视频中的背景,或者开发更复杂的特效来增强视频内容。随着技术的不断进步,视频处理的边界也在不断扩展,为我们提供了无限的可能性。

相关推荐
元争栈道1 分钟前
webview+H5来实现的android短视频(短剧)音视频播放依赖控件资源
android·音视频
Dream_Snowar7 分钟前
速通Python 第四节——函数
开发语言·python·算法
西猫雷婶8 分钟前
python学opencv|读取图像(十四)BGR图像和HSV图像通道拆分
开发语言·python·opencv
汪洪墩1 小时前
【Mars3d】设置backgroundImage、map.scene.skyBox、backgroundImage来回切换
开发语言·javascript·python·ecmascript·webgl·cesium
云空1 小时前
《QT 5.14.1 搭建 opencv 环境全攻略》
开发语言·qt·opencv
编码小哥1 小时前
opencv中的色彩空间
opencv·计算机视觉
吃个糖糖1 小时前
34 Opencv 自定义角点检测
人工智能·opencv·计算机视觉
花花少年1 小时前
【Windows版】opencv 和opencv_contrib配置
opencv·opencv_contrib
YRr YRr1 小时前
解决Ubuntu 20.04上编译OpenCV 3.2时遇到的stdlib.h缺失错误
linux·opencv·ubuntu
程序员shen1616112 小时前
抖音短视频saas矩阵源码系统开发所需掌握的技术
java·前端·数据库·python·算法