使用Python和OpenCV实现动态背景的画中画效果

 更新时间:2024年11月20日 10:59:53   作者:黑金IT  
这篇文章将通过一个详细的Python脚本,使用OpenCV库来为视频添加动态背景,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

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

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

代码解析与注释

# 视频文件路径
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在视频处理方面的强大能力。通过简单的代码,我们就能够实现复杂的视频合成效果。这不仅为视频制作人员提供了便利,也为爱好者提供了一个学习和实验的平台。

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

到此这篇关于使用Python和OpenCV实现动态背景的画中画效果的文章就介绍到这了,更多相关Python OpenCV动态背景内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python time库的时间时钟处理

    Python time库的时间时钟处理

    这篇文章主要介绍了Python time库的时间时钟处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • Django+Nginx+uWSGI 定时任务的实现方法

    Django+Nginx+uWSGI 定时任务的实现方法

    本文主要介绍了Django+Nginx+uWSGI 定时任务的实现方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • PyTorch中Tensor的维度变换实现

    PyTorch中Tensor的维度变换实现

    这篇文章主要介绍了PyTorch中Tensor的维度变换实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • python中如何对多变量连续赋值

    python中如何对多变量连续赋值

    这篇文章主要介绍了python中如何对多变量连续赋值的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Python爬虫新手入门之初学lxml库

    Python爬虫新手入门之初学lxml库

    这篇文章主要给大家介绍了关于Python爬虫新手入门之初学lxml库的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Python实现搜索Google Scholar论文信息的示例代码

    Python实现搜索Google Scholar论文信息的示例代码

    这篇文章主要为大家详细介绍了如何利用Python实现搜索Google Scholar论文信息的功能,文中的示例代码讲解详细,需要的可以参考一下
    2023-03-03
  • 探索Python中双下划线的特殊方法属性魔法世界

    探索Python中双下划线的特殊方法属性魔法世界

    这篇文章主要为大家介绍了Python中双下划线的特殊方法属性魔法世界探索,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Django数据库(SQlite)基本入门使用教程

    Django数据库(SQlite)基本入门使用教程

    django有默认自带的数据库,当然也可以用其他的数据库,下面这篇文章主要给大家介绍了关于Django数据库(SQlite)基本入门使用教程的相关资料,需要的朋友可以参考下
    2022-07-07
  • 使用Python pip怎么升级pip

    使用Python pip怎么升级pip

    这篇文章主要介绍了使用Python pip怎么升级pip,本文给大家分享方法和实现步骤对python pip升级pip相关知识感兴趣的朋友跟随小编一起看看吧
    2020-08-08
  • 基于Python的接口自动化unittest测试框架和ddt数据驱动详解

    基于Python的接口自动化unittest测试框架和ddt数据驱动详解

    这篇文章主要介绍了基于Python的接口自动化unittest测试框架和ddt数据驱动详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01

最新评论