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

embedded/2024/9/23 2:28:02/

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/embedded/7026.html

相关文章

Android Studio 之 Intent及其参数传递

一、Intent 显式Intent&#xff1a;通过组件名指定启动的目标组件,比如startActivity(new Intent(A.this,B.class)); 每次启动的组件只有一个~隐式Intent:不指定组件名,而指定Intent的Action,Data,或Category,当我们启动组件时, 会去匹配AndroidManifest.xml相关组件的Intent-…

Spring Cloud 运维篇1——Jenkins CI/CD 持续集成部署

Jenkins 1、Jenkins是什么&#xff1f; Jenkins 是一款开源 CI/CD 软件&#xff0c;用于自动化各种任务&#xff0c;包括构建、测试和部署软件。 Jenkins 支持各种运行方式&#xff0c;可通过系统包、Docker 或者一个独立的 Java 程序。 Jenkins Docker Compose持续集成流…

车轮上的智能:探索机器学习在汽车行业的应用前景

文章目录 引言&#xff1a;一、机器学习在汽车设计中的应用设计优化模拟与测试 二、智能制造与生产三、自动驾驶技术感知与决策数据融合 四、市场与模式的变革五、机器学习对于汽车行业的机遇与挑战挑战机遇 引言&#xff1a; 在当今数字化时代&#xff0c;机器学习作为人工智…

R-tree原理与代码实现逻辑总结

R-tree是一种用于数据库中空间查询的索引数据结构&#xff0c;特别适用于多维空间数据的快速检索。它是一种平衡树结构&#xff0c;类似于二维的B树&#xff0c;但是用于更高维度的数据。R-tree主要用于处理诸如地理信息系统&#xff08;GIS&#xff09;、计算机辅助设计&#…

Graphql mock 方案

GraphQL API 的强类型本质非常适合模拟。模拟是 GraphQL Code-First 开发过程的重要组成部分&#xff0c;它使前端开发人员能够构建 UI 组件和功能&#xff0c;而无需等待后端实现。 我们期望基于 TS 强类型定义的特点以及中后台常见列表、详情的数据类型共性&#xff0c;实现…

链表中LinkList L与LinkList *L( * L.elem L->elem)

摘要 LinkList L&#xff1a;L是结构体指针&#xff0c;使用“->“运算符来访问结构体成员&#xff1b;&#xff08;*L&#xff09;是结构体&#xff0c;使用"."运算符访问结构体成员 函数是否有&看是否要返回该链表等&#xff0c;若返回加&&#xff0c…

NL2SQL技术方案系列(1):NL2API、NL2SQL技术路径选择;LLM选型与Prompt工程技巧,揭秘项目落地优化之道

NL2SQL技术方案系列(1):NL2API、NL2SQL技术路径选择;LLM选型与Prompt工程技巧,揭秘项目落地优化之道 NL2SQL基础系列(1):业界顶尖排行榜、权威测评数据集及LLM大模型(Spider vs BIRD)全面对比优劣分析[Text2SQL、Text2DSL] NL2SQL基础系列(2):主流大模型与微调方法精选…

陇剑杯 ios 流量分析 CTF writeup

陇剑杯 ios 流量分析 链接&#xff1a;https://pan.baidu.com/s/1KSSXOVNPC5hu_Mf60uKM2A?pwdhaek 提取码&#xff1a;haek目录结构 LearnCTF ├───LogAnalize │ ├───linux简单日志分析 │ │ linux-log_2.zip │ │ │ ├───misc日志分析 │ │…