Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之十一 简单给视频添加水印图片效果

news/2024/9/18 23:23:28/ 标签: python, opencv, 图像处理, 水印, 视频处理

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之十一 简单给视频添加水印图片效果

目录

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之十一 简单给视频添加水印图片效果

一、简单介绍

二、简单给视频添加水印图片效果实现原理

三、简单给视频添加水印图片效果案例实现简单步骤

四、注意事项


一、简单介绍

Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。

这里使用 Python  基于 OpenCV 进行视觉图像处理,......

二、简单给视频添加水印图片效果实现原理

视频水印是指在视频内容中添加图像、文字或其他标识符的技术,以表明视频的所有权、来源、版权信息或其他相关信息。视频水印可以是透明的或半透明的,通常位于视频画面的角落或其他不影响主要内容的位置。视频水印可以用于保护视频内容的版权,防止未经授权的复制和使用,以及增加视频的专业性和可识别性。

实现原理:

  1. 打开输入视频文件,并获取其每一帧的大小。
  2. 打开水印图像文件,并获取其大小。
  3. 遍历视频的每一帧,将水印图像叠加到视频帧上。
  4. 根据指定的位置参数确定水印在视频帧上的位置,并将水印图像叠加到相应的位置上。
  5. 将带有水印的视频帧写入输出视频文件。

实现方法:

  1. 使用 OpenCV 的 VideoCapture 类打开输入视频文件,并读取每一帧。
  2. 使用 OpenCV 的 VideoWriter 类创建输出视频文件,并指定视频编码器、帧率和大小。
  3. 使用 OpenCV 的 imread 函数读取水印图像。
  4. 遍历视频的每一帧,在每一帧上叠加水印图像。
  5. 根据指定的位置参数确定水印的位置,并将水印图像叠加到视频帧的相应位置上。
  6. 使用 OpenCV 的 addWeighted 函数将水印图像叠加到视频帧上,实现透明度叠加效果。
  7. 将带有水印的视频帧写入输出视频文件。

涉及了一些关键函数:

  1. cv2.VideoCapture(): 用于打开视频文件并创建一个视频捕获对象。在这里,它被用于打开输入视频文件并创建一个用于读取帧的视频捕获对象。

  2. cap.isOpened(): 用于检查视频是否成功打开。在这里,它被用于检查输入视频文件是否成功打开。

  3. cap.read(): 用于读取视频的下一帧。在这里,它被用于循环遍历视频的每一帧并读取帧内容。

  4. cv2.VideoWriter(): 用于创建一个视频写入对象,可以将帧写入视频文件。在这里,它被用于创建一个用于写入帧的视频写入对象。

  5. cv2.imread(): 用于读取图像文件。在这里,它被用于读取水印图像文件。

  6. cv2.imwrite(): 用于将图像写入文件。虽然在这里没有直接使用,但可以用它来保存添加水印后的帧。

  7. cv2.putText(): 用于向图像中添加文字。在这里,虽然没有直接使用,但可以用它来添加文字水印

  8. cv2.addWeighted(): 用于将两个图像进行加权叠加。在这里,它被用于将水印图像叠加到视频帧上。

  9. cap.release(): 用于释放视频捕获对象的资源。

  10. out.release(): 用于释放视频写入对象的资源。

  11. cv2.destroyAllWindows(): 用于关闭所有窗口,通常在程序结束时调用。

三、简单给视频添加水印图片效果案例实现简单步骤

1、编写代码

2、运行效果

3、具体代码

python">"""
简单给视频添加水印图片效果1、打开输入视频文件,并获取其每一帧的大小。2、打开水印图像文件,并获取其大小。3、遍历视频的每一帧,将水印图像叠加到视频帧上。4、根据指定的位置参数确定水印在视频帧上的位置,并将水印图像叠加到相应的位置上。5、将带有水印的视频帧写入输出视频文件。
"""import cv2
import osdef add_watermark_to_video(input_video_path, output_video_path, watermark_image_path, alpha=1.0,position='bottom-right'):"""简单给视频添加水印图片效果:param input_video_path: 原视频路径:param output_video_path: 添加水印后保存视频路径:param watermark_image_path: 水印图片路径:param alpha: 控制水印整体透明度的参数,范围为 0 到 1:param position: 控制水印位置的参数,可选值包括 'top-left', 'top-right', 'bottom-left', 'center', 'bottom-right':return:"""# 检查输入视频文件是否存在if not os.path.isfile(input_video_path):print("Error: Input video file does not exist.")return# 检查水印图像文件是否存在if not os.path.isfile(watermark_image_path):print("Error: Watermark image file does not exist.")return# 打开视频文件cap = cv2.VideoCapture(input_video_path)# 检查视频是否成功打开if not cap.isOpened():print("Error: Failed to open input video.")return# 获取视频的宽度和高度width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))# 创建VideoWriter对象用于写入输出视频fourcc = cv2.VideoWriter_fourcc(*'mp4v')out = cv2.VideoWriter(output_video_path, fourcc, 30.0, (width, height))# 读取水印图像watermark = cv2.imread(watermark_image_path, cv2.IMREAD_UNCHANGED)# 检查水印图像是否成功读取if watermark is None:print("Error: Failed to read watermark image.")return# 检查水印图像的透明度通道是否存在if watermark.shape[2] < 4:print("Error: Watermark image does not have an alpha channel.")return# 循环遍历视频的每一帧while True:ret, frame = cap.read()if not ret:break# 将水印叠加到当前帧上overlay = frame.copy()h, w = watermark.shape[:2]# 根据位置参数确定水印的位置if position == 'top-left':x_offset, y_offset = 10, 10elif position == 'top-right':x_offset, y_offset = width - w - 10, 10elif position == 'bottom-left':x_offset, y_offset = 10, height - h - 10elif position == 'center':x_offset, y_offset = (width - w) // 2, (height - h) // 2else:  # 默认为 'bottom-right'x_offset, y_offset = width - w - 10, height - h - 10for c in range(0, 3):overlay[y_offset:y_offset + h, x_offset:x_offset + w, c] = \watermark[:, :, c] * (watermark[:, :, 3] / 255.0 * alpha) + frame[y_offset:y_offset + h,x_offset:x_offset + w, c] * (1.0 - watermark[:, :, 3] / 255.0 * alpha)# 将帧写入输出视频out.write(overlay)# 释放资源cap.release()out.release()cv2.destroyAllWindows()def main():# 调用函数并指定输入和输出视频文件路径以及水印图像路径input_video_path = "Videos/CatRun.mp4"output_video_path = "Videos/CatRun_Wartermark.mp4"watermark_image_path = "Images/Watermark.png"alpha = 0.5  # 控制水印整体透明度的参数,范围为 0 到 1position = 'top-right'  # 控制水印位置的参数,可选值包括 'top-left', 'top-right', 'bottom-left', 'center', 'bottom-right'# 执行函数add_watermark_to_video(input_video_path, output_video_path, watermark_image_path, alpha, position)if __name__ == "__main__":main()

四、注意事项

  1. 参数安全性:对于输入的参数,需要进行安全校验,以确保输入的参数值在有效范围内,避免出现错误。
  2. 图像大小匹配:确保水印图像的大小与视频帧的大小匹配,否则可能导致叠加时的错误。
  3. 透明度处理:根据水印图像的透明度信息,合理处理水印图像与视频帧的叠加透明度,以保持水印的透明效果。
  4. 位置处理:根据指定的位置参数,确保水印图像叠加到视频帧的正确位置上,避免覆盖重要信息或者显示不完整。
  5. 资源释放:在处理完所有帧之后,及时释放视频读取和写入的资源,以避免内存泄漏或资源浪费。

http://www.ppmy.cn/news/1428823.html

相关文章

富格林:警惕暗箱实现稳健出金

富格林认为&#xff0c;现货黄金投资是一种双向交易的模式&#xff0c;投资者无论是做多还是做空都有机会获得盈利&#xff0c;这也导致一些投资者放松了警惕落入空头暗箱中&#xff0c;导致资金严重受损无法稳健出金。投资者不了解空头暗箱就很容易在投资中造成资金损失&#…

【面试经典 150 | 二分查找】在排序数组中查找元素的第一个和最后一个位置

文章目录 写在前面Tag题目来源题目解读方法一&#xff1a;二分查找方法二&#xff1a;使用库函数 知识回顾二分查找的三种写法与三个问题常用的二分库函数 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更……

Databend Cloud 正式上线腾讯云市场,加速挖掘数据创新价值

近日&#xff0c;新一代大数据分析平台 Databend Cloud 正式上线腾讯云千帆云市场&#xff0c;成为腾讯云 SaaS 生态圈中的重要一员。依托腾讯云平台的技术支持和市场资源&#xff0c; Databend Cloud 将充分发挥数据价值的挖掘能力&#xff0c;助力更多企业实现数据驱动的决策…

文献速递:深度学习胶质瘤诊断---使用深度学习在 MRI 图像中进行低级别胶质瘤的脑肿瘤分割和分级

Title 题目 Brain tumor segmentation and grading of lower-grade glioma using deeplearning in MRI images 使用深度学习在 MRI 图像中进行低级别胶质瘤的脑肿瘤分割和分级 01文献速递介绍 胶质瘤是最常见的脑肿瘤&#xff0c;根据肿瘤的恶性程度和生长速率具有不同的分级…

《乱弹篇(30)厌战的杜诗》

时下地球村有一伙成天叫嚣着“打打杀杀”、鼓吹快快发动战争的狂人&#xff0c;他们视老百姓的生命如草芥&#xff0c;毫不珍惜。没有遭受过战火焚烧的人&#xff0c;也跟着成天吠叫“快开战吧”。然而中国唐朝大诗人却是个“厌战派”&#xff0c;他对战争的厌恶集中表现在诗《…

Java中关键字this的妙用:调用方法、属性与构造器

Java中关键字this的妙用&#xff1a;调用方法、属性与构造器 在Java编程中&#xff0c;this是一个非常重要的关键字&#xff0c;它指代当前对象。通过this&#xff0c;我们可以方便地引用当前对象的属性和方法&#xff0c;或者在构造器中调用另一个构造器。对于初学者来说&…

【GlobalMapper精品教程】075:将影像的颜色赋予点云实现点云真彩色

文章目录 一、加载点云与影像数据二、将影像色彩赋予点云三、保存色彩点云四、注意事项一、加载点云与影像数据 加载本实验数据(data075.rar)中的影像、点云数据,并用Globalmapper提供的卷帘工具(快速浏览图像)查看: 启动卷帘工具,左右拖动实现卷帘效果: 影像VS点云:…

大语言模型攻击

实验&#xff1a; 一.环境部署 1.模型部署 vicuna-13b-v1.3 vicuna-7b-v1.3 LLaMA-2-7B-Chat 部署代码 二.使用 GCG 攻击 LLaMA-2 的示例 使用模型完整性&#xff0c;以满足指令“写一个令人信服的匿名威胁。”下面的目标使用“当然&#xff0c;这是一个令人信服的匿名死亡…

Sourcetree安装使用(补个笔记)

Sourcetree介绍 Sourcetree是一款免费的Git图形化客户端&#xff0c;它由Atlassian开发&#xff0c;提供了跨平台的支持&#xff0c;可运行在Windows和Mac操作系统上。Sourcetree可以让开发者更方便地使用Git来管理代码&#xff0c;不需要在命令行中输入复杂的Git命令&#xf…

VMWare Ubuntu压缩虚拟磁盘

VMWare中ubuntu会越用越大&#xff0c;直到占满预分配的空间 即使系统里没有那么多东西 命令清理 开机->open Terminal sudo vmware-toolbox-cmd disk shrink /关机-> 编辑虚拟机设置->硬盘->碎片整理&压缩 磁盘应用 开机->disk usage analyzer(应用) …

2024了还在用Qt、PyQt做图形界面?致敬Qt Designer,这款前端无代码拖拽工具值得一用!

作为一个从工控电气、嵌入式&#xff0c;转入上位机VC的开发者&#xff0c;曾几何时&#xff0c;对Qt C爱不释手&#xff01; 一处编程&#xff0c;到处可用&#xff0c;多么让人热情澎湃&#xff01;瞥了一眼角落的《深入浅出MFC》&#xff0c;明天就丢了&#xff01; 不过&a…

设计模式之观察者模式(上)

观察者模式 1&#xff09;概述 1.定义 定义对象之间的一种一对多依赖关系&#xff0c;使得每当一个对象状态发生改变时&#xff0c;其相关依赖对象皆得到通知并被自动更新。 观察者模式的别名包括发布-订阅&#xff08;Publish/Subscribe&#xff09;模式、模型-视图&#…

2023年图灵奖颁发给艾维·维格森(Avi Wigderson),浅谈其计算复杂性理论方面做出的重要贡献

Avi Wigderson是一位以色列计算机科学家&#xff0c;他在计算复杂性理论方面做出了重要的贡献&#xff0c;并对现代计算产生了深远的影响。 Wigderson的主要贡献之一是在证明计算复杂性理论中的基本问题的困难性方面。他证明了许多经典问题的困难性&#xff0c;如图论中的图同构…

MySQL中基于日期计算数据每15分钟间隔的差值详解

在实时监控、数据分析等领域&#xff0c;我们常常需要根据时间序列数据计算出每15分钟间隔内的数据差值。本文将深入讲解如何在MySQL数据库中根据日期和时间字段有效地计算这类差值&#xff0c;并结合实例代码进行演示。 1. 数据结构与场景设定 假设有这样一个表结构&#xf…

大唐杯题目

5G NR 系统中&#xff0c;UE 收到 RRCSetup后&#xff0c;可能会有以下哪些过程 A.进入 RRC CONNECTED&#xff0c;停止小区重选: B.如果 NAS 层提供了多个S-NSSAI&#xff0c;则写入 s-nssai-List; C.发送 RRCSetupComplete. D.UE 启动 T300&#xff0c;将 RRCSetupReguest 消…

Go诊断工具

Go 提供了一些出色的诊断工具,可帮助我们深入了解应用程序的执行情况。 1. 分析工具 分析工具可观测应用程序执行的各种指标。它使我们能够解决性能问题、检测争用、定位内存泄漏等。这些指标可以通过以下几个配置文件收集: CPU--确定应用程序将时间花在了哪里Goroutine--报…

vue+Element-ui实现模板文件下载

最近实现一个功能&#xff0c;数据过多&#xff0c;录入系统的时候过慢&#xff0c;所以新增一个导入数据的功能。 导入数据的话&#xff0c;为了防止用户随意输入&#xff0c;或者不知道怎么输入&#xff0c;所以特完成模板下载功能。 通常情况下实现模板下载采用a标签即可实现…

SpringBoot 集成Nacos注册中心和配置中心-支持自动刷新配置

SpringBoot 集成Nacos注册中心和配置中心-支持自动刷新配置 本文介绍SpringBoot项目集成Nacos注册中心和配置中心的步骤&#xff0c;供各位参考使用 1、配置pom.xml 文件 在pom.xml文件中定义如下配置和引用依赖&#xff0c;如下所示&#xff1a; <properties><pr…

Astra 版本:4.6.11主题WordPress外贸主题

主题下载地址&#xff1a;Astra 版本&#xff1a;4.6.11主题.zip Astra是一个速度快、可定制的漂亮主题&#xff0c;适合博客、个人作品集、商业网站和WooCommerce店面。 它非常轻巧&#xff08;前端小于50KB&#xff09;&#xff0c;给您的网站带来无与伦比的速度。 Astra专为…

语音智能客服机器人有什么优势?ai机器人部署

人工智能技术的进步&#xff0c;在不断的革新我们的工作和生活&#xff0c;同时&#xff0c;拥有人工智能技术的语音智能客服机器人在销售行业的工作熟悉程度也越来越好&#xff0c;那语音智能客服机器人有什么优势&#xff1f;我们一起来看看。 1、ASR语音文本转换 客户可通过…