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

server/2024/9/18 23:23:36/ 标签: 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/server/7245.html

相关文章

rCore-Tutorial-Book第二课(移除Rust std标准库依赖)

本节任务: 移除掉代码对 Rust std标准库的依赖&#xff0c;并将自己的程序改造成为能被编译到 RV64GC 裸机平台 文章目录 1. 移除 println! 宏1.1 rust代码编译到指定目标平台1.2 禁用 rust-std 标准库1.3 提供panic_handler 功能 2. 移除main 函数3. 分析被移除标准库的程序3.…

从零实现诗词GPT大模型:实现Transformer架构

专栏规划: https://qibin.blog.csdn.net/article/details/137728228 首先说明一下,跟其他文章不太一样,在本篇文章中不会对Transformer架构中的自注意力机制进行讲解,而是后面单独1~2篇文章详细讲解自注意力机制,我认为由浅入深的先了解Transformer整体架构和其中比较简单…

OWASP发布大语言模型网络安全与治理清单

当前人工智能技术面临的最大风险是大语言模型&#xff08;LLM&#xff09;和生成式人工智能技术的发展和应用速度已经远远超过了安全和治理的速度。 OpenAI、Anthropic、谷歌和微软等公司的生成式人工智能和大语言模型产品的使用正呈指数级增长。与此同时&#xff0c;开源大语…

成长工作思考

前言 这一篇&#xff0c;不是技术博客&#xff0c;而是个人发展的一些思考和总结&#xff0c;复盘才会做的更好&#xff0c;成长的道路当然不是随着时间推移 开场白 不劳而获的是时间&#xff0c;完全免费的&#xff0c;但是免费的同时也是最贵的。向前看仿佛时间悠悠无边&a…

【24届数字IC秋招总结】正式批面试经验汇总6——禾赛

文章目录 一、禾赛-数字IC验证工程师1.1 一面面试问题1.2 二面面试问题一、禾赛-数字IC验证工程师 面试时间:9.19 9.25 1.1 一面面试问题 1、自我介绍 2、研究生课题 3、build_phase从上至下还是从下至上 4、哪些phase是task phase 5、perl脚本做了什么 6、整个验证环境是怎…

SOCKS5代理(源码)

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 SOCKS5是个代理服务器协议。 我…

IOS H5页面中 HLS视频无法正常播放,使用hls.插件

IOS H5页面中 HLS视频无法正常播放&#xff0c;使用hls.插件 HLS.js依靠 HTML5 视频和 MediaSource Extensions 进行播放。 所有 iPhone 浏览器 &#xff08;iOS&#xff09; 都没有可用的 MediaSourceExtension&#xff0c;因此Hls.js将不起作用。如果您在 iPhone 上检查 Hl…

excel多sheet导出工具类——java

excel多sheet导出工具类 1、多个sheet导出工具类&#xff1a; import org.apache.commons.lang3.StringUtils; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.user…

最全!2024腾讯春招Spring Circuit Breaker面试题大全,附详解和技巧,必备收藏!

面对2024年腾讯春季招聘&#xff0c;准备充分的技术面试答案至关重要&#xff0c;尤其是在微服务架构和高可用性设计方面。Spring Circuit Breaker作为维持微服务稳定性和可靠性的关键技术&#xff0c;了解其工作原理和实际应用对于任何希望在当今技术驱动的环境中取得成功的软…

Web3与社会契约:去中心化治理的新模式

在数字化时代&#xff0c;技术不断为我们提供新的可能性&#xff0c;而Web3技术作为一种基于区块链的创新&#xff0c;正在引领着互联网的下一波变革。它不仅改变了我们的经济模式和商业逻辑&#xff0c;还对社会契约和权力结构提出了全新的挑战和思考。本文将深入探讨Web3的基…

解读我国最新网络安全运维与数据处理安全规范:强化数字化时代安全基石

近日&#xff0c;全国网络安全标准化技术委员会秘书处公布了一系列重要的网络安全与数据安全相关技术规范草案&#xff0c;包括《网络安全技术 网络安全运维实施指南》、《网络安全技术 信息系统灾难恢复规范》以及《数据安全技术 政务数据处理安全要求》。这些规范旨在应对当前…

动手写sql 《牛客网80道sql》

第1章&#xff1a;SQL编写基础逻辑和常见问题 基础逻辑 SELECT语句: 选择数据表中的列。FROM语句: 指定查询将要从哪个表中检索数据。WHERE语句: 过滤条件&#xff0c;用于提取满足特定条件的记录。GROUP BY语句: 对结果进行分组。HAVING语句: 对分组后的结果进行条件过滤。O…

【Java EE】Spring核心思想(一)——IOC

文章目录 &#x1f38d;Spring 是什么&#xff1f;&#x1f384;什么是IoC呢&#xff1f;&#x1f338;传统程序开发&#x1f338;传统程序开发的缺陷&#x1f338;如何解决传统程序的缺陷&#xff1f;&#x1f338;控制反转式程序开发&#x1f338;对比总结 &#x1f332;理解…

Github2024-04-15 开源项目周报 Top15

根据Github Trendings的统计,本周(2024-04-15统计)共有15个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目8TypeScript项目5C项目2C++项目2Go项目1Rust项目1JavaScript项目1Shell项目1Git - 快速、可扩展、分布式的版本控制系统 创建周期:5…

mysql 面试题

事务是什么 事务是数据库管理系统&#xff08;DBMS&#xff09;中的一个重要概念&#xff0c;用于管理对数据库进行读写操作的一组相关操作。事务是一个原子性、一致性、隔离性和持久性&#xff08;ACID&#xff09;的工作单元。 具体来说&#xff0c;事务具有以下四个特性&a…

Oracle Cloud实例端口无法访问

问题 我在Oracle Cloud上创建实例以后&#xff0c;在网络的安全列表中也增加了对应端口的条目。但是端口无法访问。 排查 起初以为是我选择了Ubuntu的镜像导致的&#xff0c;更换为Oracle Linux&#xff0c;问题依旧。 后来以为是我的操作过程有问题&#xff0c;按照Oracle自…

设计模式-工厂模式

工厂模式 1、简单工厂 简单工厂比较简单,它的作用就是把对象的创建放到一个工厂类中,通过参数来创建不同的对象。 在分布式事务框架Seata中,如果发生异常,则需要进行二阶段回滚。 它的过程是,通过事务id找到undoLog记录,然后解析里面的数据生成SQL,将一阶段执行的S…

Kafka -基本概念

认识Kafka kafka是一个多分区、多副本、基于zookeeper协调的分布式消息系统。 扮演角色 消息系统存储系统&#xff1a;把消息持久化到磁盘&#xff0c;相比于其他基于内存存储的系统而言&#xff0c;有效降低了数据丢失的风险。流式处理平台 基本概念 kafka的体系结构&…

[计算机效率] 文字识别工具:天若OCR

3.27 文字识别工具&#xff1a;天若OCR 天若OCR是一款功能强大的图文识别工具&#xff0c;它能够将图像中的文本字符转换为可编辑的文本&#xff0c;实现了文本识别和转换的需求。无论是扫描的文档、拍摄的照片&#xff0c;还是网页截图&#xff0c;天若OCR都能准确识别出其中…

微信小程序获取蓝牙信标

/*** 搜索设备界面*/ import Dialog from vant/weapp/dialog/dialog; Page({data: {list: []},onPullDownRefresh: function () {wx.request({url: https://wwz.jingyi.icu/app/Explain/index,data: {scenic_id: 3},method: POST,success: (res) > {console.log(res);let th…