Python 基于 OpenCV 视觉图像处理实战 之 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、具体代码

"""
简单给视频添加水印图片效果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.mzph.cn/news/818012.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux学习】初识Linux指令(二)

文章标题 1.rm 指令2.man指令3.nano指令4.cp指令5.mv指令6.alias指令7. cat与8.echo指令 ⚶文章简介 ⚶本篇文章继上篇文章Linux指令讲解&#xff0c;本篇文章主要会涉及到的指令会有&#xff1a;rm指令与 *&#xff08;通配符&#xff09;的搭配使用&#xff0c;man指令&…

专业SEO优化指南:设置网站关键词的详细步骤

在网站SEO优化的过程中&#xff0c;关键词的设置是提升网站排名的关键步骤之一。那么&#xff0c;作为一名专业的SEO人员&#xff0c;如何有效地进行关键词设置呢&#xff1f;以下是一些详细的步骤&#xff1a; 1. 确定网站的核心关键词。 这需要深入理解网站的主题或产品。通…

整体性学习

整体性学习的顺序&#xff1a; 1.获取 2.理解&#xff08;明白&#xff09;3.拓展&#xff08;探究&#xff09;4.纠错&#xff08;调试&#xff09;5.应用 测试伴随每一个过程 例如&#xff1a; 吃饭&#xff08;去学习&#xff09;–>点菜&#xff08;学什么&#xff0c…

实时数据同步之Maxwell和Canal

文章目录 一、概述1、实时同步工具概述1.1 Maxwell 概述1.2 Canal概述 2、数据同步工作原理2.1 MySQL 主从复制过程2.2 两种工具工作原理 3、MySQL 的 binlog详解3.1 什么是 binlog3.2 binlog 的开启3.3 binlog 的分类设置 4、Maxwell和Canal对比5、环境安装 二、Maxwell 使用1…

日本极致产品力|一个战略符号打造年销售超4亿份的冰淇淋大单品

日本赤城乳业有一款冰棍——ガリガリ君(GariGarikun)&#xff0c;凭借着自己的“纯粹”打入市场&#xff0c;几十年来它成为许多日本人的夏日必备。他让人记忆最深刻的是战略符号——ガリガリ君&#xff0c;让赤城乳业打造出年销售4亿份的冰淇淋大单品。它是如何做到的呢? 石油…

Day55 动态规划 part15

Day55 动态规划 part15 392.判断子序列 我的思路&#xff1a; 自己还是只能想到双指针法 解答: class Solution {public boolean isSubsequence(String s, String t) {if(s.length() 0) {return true;}if(s.length() > t.length() || t.length() 0) {return false;}ch…

性能再升级!UNet+注意力机制,新SOTA分割准确率高达99%

UNet结合注意力机制能够有效提升图像分割任务的性能。 具体来说&#xff0c;通过将注意力模块集成到UNet的架构中&#xff0c;动态地重新分配网络的焦点&#xff0c;让其更集中在图像中对于分割任务关键的部分。这样UNet可以更有效地利用其跳跃连接特性&#xff0c;以精细的局…

VMware安装Linux虚拟机(rocky9)

软件准备&#xff1a; VMware虚拟机ISO系统镜像文件 选择创建虚拟机→典型→下一步→点击稍后安装操作系统 选择Linux系统和对应版本 输入虚拟机名称和选择保存位置 设置磁盘大小 根据需要自定义硬件配置→完成 然后点击编辑虚拟机设置→CD/DVD→选择ISO镜像 然后开启虚拟机→…

动态规划|343.整数拆分

力扣题目链接 class Solution { public:int integerBreak(int n) {vector<int> dp(n 1);dp[2] 1;for (int i 3; i < n ; i) {for (int j 1; j < i / 2; j) {dp[i] max(dp[i], max((i - j) * j, dp[i - j] * j));}}return dp[n];} }; 思路 看到这道题目&…

【GD32】 2.39 FR1002人脸识别模块

2.39 FR1002人脸识别模块 FR1002人脸识别模组解决方案以高性能应用处理器为硬件平台&#xff0c;配合双目传感器进行活体检测&#xff0c;具有启动速度快、金融级的识别能力、超低使用功耗等特点。凭借超低功耗、强大的运算速度&#xff0c;在多种应用领域中&#xff0c;为各行…

关于《CS创世 SD NAND》的技术学习分享

最近发现一个好玩的东西《CS创世 SD NAND》&#xff0c;带大家一起体验一下。 本文引用了部分厂家产品资料及图像&#xff0c;如有侵权&#xff0c;请及时联系我删除&#xff0c;谢谢。 《CS创世 SD NAND》官方网站&#xff1a;http://www.longsto.com/ 什么是CS创世 SD NAND呢…

【300套】基于Springboot+Vue的Java实战开发项目(附源码+演示视频+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f9e1;今天给大家分享300的Java毕业设计&#xff0c;基于Springbootvue框架&#xff0c;这些项目都经过精心挑选&#xff0c;涵盖了不同的实战主题和用例&#xff0c;可做毕业…

【vue】用vite创建vue项目

前置要求 要有Node.js 1. 用vite创建vue项目 在cmd中&#xff0c;进入一个文件夹 在文件资源管理器上面的文件目录中&#xff0c;输入cmd&#xff0c;回车在cmd中通过cd命令进入对应文件夹 创建项目 npm create vitelatest # 创建项目创建项目过程中的一些选项 Ok to pro…

Fake-SMS恶意软件混淆分析——低代码的时代来了

写在前面的话 在安全社区中&#xff0c;只要聊到开源代码使用方面的话题&#xff0c;就肯定会聊到安全问题。虽然使用开源代码通常会被认为是安全的&#xff0c;但我们需要清楚的是&#xff0c;与非FOSS&#xff08;自由与开源软件&#xff09;解决方案相比&#xff0c;开源软…

Hive on spark源码编译与调优

文章目录 一、编译环境准备1、hadoop和hive安装2、编译环境搭建3、Hive on Spark配置 二、Hive相关问题1、Hadoop和Hive的兼容性问题1.1 问题描述1.2 解决思路1.3 修改并编译Hive源码 2、Hive插入数据StatsTask失败问题3.1 问题描述3.2 解决思路 3、Hive和Spark兼容性问题3.1 问…

【Android surface 】二:源码分析App的surface创建过程

文章目录 画布surfaceViewRoot的创建&setView分析setViewrequestLayoutViewRoot和WMS的关系 activity的UI绘制draw surfacejni层分析Surface无参构造SurfaceSessionSurfaceSession_init surface的有参构造Surface_copyFromSurface_writeToParcelSurface_readFromParcel 总结…

【Hive上篇: 一篇文章带你使用Hive!深入了解Hive!学会Hive!】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;本篇文章主要分享的是大数据开发中hive的相关技术&#xff0c;什么是Hive&#xff1f;怎么使用Hive&#xff1f;怎么安装部署&#xff1f;希望大家看完这篇文章会有所帮助。也希望大家能够…

Depth maps转点云

前言 本文主要记录一下如何可视化相机位姿&#xff0c;如何用Blender得到的深度图反投影到3D空间&#xff0c;得到相应的点云。 Refernce https://github.com/colmap/colmap/issues/1106 https://github.com/IntelRealSense/librealsense/issues/12090 https://medium.com/yod…

【详细讲解下Photoshop】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

鸿蒙 Failed :entry:default@CompileResource...

Failed :entry:defaultCompileResource... media 文件夹下有文件夹或者图片名称包含中文字符 rawfile 文件夹下文件名称、图片名称不能包含中文字符