python视频编辑中的蒙版技术:创意与技术相结合

在数字视频编辑的世界里,蒙版技术是一种强大的工具,它允许我们在视频帧上进行精确的编辑和效果叠加。通过蒙版,我们可以控制哪些部分的视频内容被显示或隐藏,从而创造出各种视觉效果和过渡。在本文中,我们将探讨如何使用Python和OpenCV库来实现视频蒙版技术,以及如何将这种技术应用于实际项目中。
在这里插入图片描述

蒙版技术简介

蒙版技术在视频编辑中的作用类似于Photoshop中的图层蒙版。它允许我们在一个视频帧上定义一个区域,这个区域可以是透明的、半透明的或者完全遮挡的。通过这种方式,我们可以在视频的特定区域上叠加其他视频或图像内容,或者将特定区域与背景融合。

实现视频蒙版

在Python中,我们可以使用OpenCV库来实现视频蒙版。OpenCV是一个强大的计算机视觉库,它提供了广泛的图像和视频处理功能。
以下是实现视频蒙版的步骤:

  1. 读取视频和背景图像:首先,我们需要读取视频文件和将要作为背景的图像文件。
  2. 创建蒙版:接着,我们创建一个与视频帧大小相同的蒙版,蒙版上的特定区域被设置为白色(表示显示视频内容),其余区域为黑色(表示隐藏视频内容)。
  3. 应用蒙版:然后,我们将蒙版应用到视频帧上,使得蒙版区域显示视频内容,蒙版外的区域显示背景图像。
  4. 保存结果:最后,我们将处理后的视频帧保存为新的视频文件
   import cv2
    import numpy as np
    import imageio

    # 视频文件路径
    input_video_path = 'sc/input_video.mp4'
    # 输出视频文件路径
    output_video_path = 'output_video5.mp4'
    # GIF动画背景文件路径
    background_gif_path = 'sc/modified_5169_2.gif'
    # 背景透明度(0.0 完全透明,1.0 完全不透明)
    background_opacity = 0.3

    # 读取视频文件
    cap = cv2.VideoCapture(input_video_path)

    # 获取视频帧的尺寸
    ret, frame = cap.read()
    if not ret:
        print("无法读取视频文件")
        exit()

    height, width = frame.shape[:2]

    # 读取GIF动画背景
    gif_reader = imageio.get_reader(background_gif_path)
    gif_frames = []
    for image in gif_reader:
        # 确保GIF帧是RGB格式,且尺寸与视频帧匹配
        image_rgb = cv2.cvtColor(image, cv2.COLOR_RGBA2RGB) if image.shape[2] == 4 else image
        image_resized = cv2.resize(image_rgb, (width, height))
        gif_frames.append(image_resized)

    gif_frame_count = len(gif_frames)
    gif_frame_index = 0

    # 定义黑色实心矩形的尺寸变量
    top_bar_height = 50  # 顶部黑色实心矩形的高度
    bottom_bar_height = 100  # 底部黑色实心矩形的高度

    # 定义蒙版的位置和大小
    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))

    # 遍历视频帧
    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)

        # 获取当前GIF帧
        current_gif_frame = gif_frames[gif_frame_index % gif_frame_count]

        # 创建反向蒙版
        inv_mask = cv2.bitwise_not(mask)

        # 调整GIF帧的透明度
        current_gif_frame = current_gif_frame.astype(float) * background_opacity
        current_gif_frame = np.clip(current_gif_frame, 0, 255).astype(np.uint8)

        # 将GIF背景与蒙版的反向进行混合
        masked_background = cv2.bitwise_and(current_gif_frame, inv_mask)

        # 将两个混合结果相加
        result_frame = cv2.add(masked_frame, masked_background)

        # 显示结果
        cv2.imshow('Result Video', result_frame)

        # 保存帧
        out.write(result_frame)

        # 更新GIF帧索引
        gif_frame_index += 1

        # 按'q'退出
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

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

这段代码读取一个视频文件,并在其上添加一个蒙版,蒙版区域显示视频内容,而蒙版外的区域显示一个GIF动画背景。代码中还包括了在视频帧的顶部和底部绘制黑色实心矩形,以及调整GIF帧的透明度。每一帧处理后的结果都会被显示和保存,直到视频结束或用户按下’q’键退出。最后,释放所有资源
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/918968.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端算法:树(力扣144、94、145、100、104题)

目录 一、树(Tree) 1.介绍 2.特点 3.基本术语 4.种类 二、树之操作 1.遍历 前序遍历(Pre-order Traversal):访问根节点 -> 遍历左子树 -> 遍历右子树。 中序遍历(In-order Traversal&#xf…

【代码审计】常见漏洞专项审计-业务逻辑漏洞审计

❤️博客主页: iknow181 🔥系列专栏: 网络安全、 Python、JavaSE、JavaWeb、CCNP 🎉欢迎大家点赞👍收藏⭐评论✍ 0x01 漏洞介绍 1、 原理 业务逻辑漏洞是一类特殊的安全漏洞,业务逻辑漏洞属于设计漏洞而非实…

Spring Boot汽车资讯:数字化时代的驾驶

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示: 图4-1系统工作原理…

Redis的缓存穿透、缓存雪崩、缓存击穿问题及有效解决方案

目录 一、缓存穿透 1.简介 2.解决方案 3.修改前的代码 4.修改过后的代码 二、缓存雪崩 1.简介 2.解决方案 三、缓存击穿 1.简介 2.解决方案 3.用代码来实现互斥锁来解决缓存击穿 4.用代码来实现逻辑过期解决缓存击穿 四、缓存穿透和缓存击穿的区别 一、缓存穿透 …

FPGA 第7讲 简单组合逻辑译码器

时间:2024.11.15 一、学习内容 1.译码器 译码是编码的逆过程,在编码时,每一种二进制代码,都赋予了特定的含义,即都表示了一个确定的信号或者对象。把代码状态的特定含义翻译出来的过程叫做译码,实现译码操…

如何在 Ubuntu 上安装 Jupyter Notebook

本篇文章将教你在 Ubuntu 服务器上安装 Jupyter Notebook,并使用 Nginx 和 SSL 证书进行安全配置。 我将带你一步步在云服务器上搭建 Jupyter Notebook 服务器。Jupyter Notebook 在数据科学和机器学习领域被广泛用于交互式编码、可视化和实验。在远程服务器上运行…

【Pikachu】XML外部实体注入实战

若天下不定&#xff0c;吾往&#xff1b;若世道不平&#xff0c;不回&#xff01; 1.XXE漏洞实战 首先写入一个合法的xml文档 <?xml version "1.0"?> <!DOCTYPE gfzq [<!ENTITY gfzq "gfzq"> ]> <name>&gfzq;</name&…

Docker安装稳定版本nginx-1.26.2

Linux 安装稳定版本nginx-1.20.2 1、下载镜像、场景配置文件目录 [rootTseng ~]# docker pull nginx:1.26.2 1.26.2: Pulling from library/nginx 2d429b9e73a6: Pull complete 40a0d865309c: Pull complete a949b43e642c: Pull complete 8a756fb620a9: Pull complete 93…

训练误差or测试误差与特征个数之间的关系--基于R语言实现

a 生成数据集&#xff0c;数据由 Y X β ϵ YX\beta\epsilon YXβϵ产生&#xff0c;其中 p 20 &#xff0c; n 1000 p20&#xff0c;n1000 p20&#xff0c;n1000 #way1 set.seed(1) p 20 n 1000 x matrix(rnorm(n*p), n, p) B rnorm(p) B[3] 0 B[4] 0 B[9] 0 B[19…

kafka基础

文章目录 一、Kafka入门1.1、JMS1.2、生产者-消费者模式1.3、ZooKeeper 二、kafka基础架构2.1、producer2.2、kafka cluster2.2.1、broker2.2.2、Controller2.2.3、Topic2.2.4、Partition2.2.5、Replication2.2.6、Leader & Follower 2.3、consumer 一、Kafka入门 Kafka是一…

HarmonyOs鸿蒙开发实战(10)=>状态管理-对象数组的属性数据变更刷新UI,基于@Observed 和@ObjectLink装饰器

1.条件:基于HarmonyOs5.0.0版本. 2.功能要求&#xff1a;横向列表中每个景点的名称&#xff08;eg: 第二项 “灵隐寺” &#xff09;, 在通过天气接口拿到对应天气后&#xff0c;拼接到名称后面 > 变成&#xff08;“灵隐寺” 天气&#xff09;&#xff09; 3.老规矩先看…

诡异错误:返回给前端的id被前端自动修改

使用mybatis-plus生成的id&#xff0c;使用雪花算法&#xff0c;是一个long类型的id。 当调用list接口返回给前端后&#xff0c;接口显示数据正常&#xff0c;但是界面上的id不对&#xff0c;多了好几个0&#xff0c;数据都是以0结尾。 由于前端使用vue编写&#xff0c;我不太会…

Django5 2024全栈开发指南(一):框架简介、环境搭建与项目结构

目录 一、Python Web框架要点二、Django流程2.1 Django介绍2.1.1 简介2.1.2 特点2.1.3 MVT模式2.1.4 Django新特性2.1.5 Django学习资料 2.2 搭建Django框架开发环境2.2.1 安装Python语言环境2.2.2 安装Django框架 2.3 创建Django项目2.4 Pycharm创建项目2.5 初试Django52.5.1 …

大模型研究报告 | 2024年中国金融大模型产业发展洞察报告|附34页PDF文件下载

随着生成算法、预训练模型、多模态数据分析等AI技术的聚集融合&#xff0c;AIGC技术的实践效用迎来了行业级大爆发。通用大模型技术的成熟推动了新一轮行业生产力变革&#xff0c;在投入提升与政策扶植的双重作用下&#xff0c;以大模型技术为底座、结合专业化金融能力的金融大…

深入内核讲明白Android Binder【一】

深入内核讲明白Android Binder【一】 前言一、Android Binder应用编写概述二、基于C语言编写Android Binder跨进程通信Demo0. Demo简介1. 服务的管理者server_manager.c2. Binder服务端代码实现 test_service.c2.1 实现思路2.2 完整实现代码 3. Binder客户端代码实现 test_clie…

新一代API开发工具,让API调试更快 更简单

新一代API开发工具 代理调试 请求测试一站式解决方案 Reqable Fiddler Charles Postman, 让API调试更快 &#x1f680; 更简单 &#x1f44c; 直接上下载地址 根据系统,下载对应的版本即可 https://reqable.com/zh-CN/download/

LVGL-从入门到熟练使用

LVGL简介 LVGL&#xff08; Light and Versatile Graphics Library &#xff09;是一个轻量、多功能的开源图形库。 1、丰富且强大的模块化图形组件&#xff1a;按钮 、图表 、列表、滑动条、图片等 2、高级的图形引擎&#xff1a;动画、抗锯齿、透明度、平滑滚动、图层混合等…

从视频帧生成点云数据、使用PointNet++模型提取特征,并将特征保存下来的完整实现。

文件地址 https://github.com/yanx27/Pointnet_Pointnet2_pytorch?spm5176.28103460.0.0.21a95d27ollfze Pointnet_Pointnet2_pytorch\log\classification\pointnet2_ssg_wo_normals文件夹改名为Pointnet_Pointnet2_pytorch\log\classification\pointnet2_cls_ssg "E:…

时间序列关于可解释性值得关注的论文汇总-第2篇

前言 这是时序可解释性论文汇总的第二篇&#xff0c;第一篇见这里&#xff08;后台回复&#xff1a;“论文合集”可直接获取整理的文章&#xff09;。深度学习的可解释性研究一直是热门&#xff0c;而时间序列的可解释性同样非常重要。这是因为时序模型被大量应用到特定领域&a…

DataStream编程模型之数据源、数据转换、数据输出

Flink之DataStream数据源、数据转换、数据输出&#xff08;scala&#xff09; 0.前言–数据源 在进行数据转换之前&#xff0c;需要进行数据读取。 数据读取分为4大部分&#xff1a; &#xff08;1&#xff09;内置数据源&#xff1b; 又分为文件数据源&#xff1b; socket…