Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之三 简单动态聚光灯效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之三 简单动态聚光灯效果

目录

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之三 简单动态聚光灯效果

一、简单介绍

二、简单动态聚光灯效果实现原理

三、简单动态聚光灯效果案例实现简单步骤

四、注意事项


一、简单介绍

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

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

二、简单动态聚光灯效果实现原理

简单动态聚光灯效果,这里视频中出现了彩色的光圈,随着视频的播放在图像的不同位置游走。

原理和实现方法:

  1. 初始化

    • 读取输入视频文件和获取视频的帧率、尺寸。
    • 创建输出视频文件。
  2. 生成聚光灯

    • 在程序开始时,随机生成多盏聚光灯。每盏聚光灯由位置、颜色、移动角度和速度组成。
  3. 逐帧处理

    • 读取输入视频的每一帧。
    • 在每一帧上应用所有聚光灯的效果,并将其叠加到原始帧上。
    • 更新每一盏聚光灯的位置,如果聚光灯到达视频边缘,则随机选择新的移动角度和速度。
  4. 写入输出

    • 将处理后的帧写入输出视频文件。

在这两个函数中,涉及了一些 OpenCV 和 NumPy 的函数,下面是它们的说明:

OpenCV 函数:

  1. cv2.resize()

    • 用于调整图像的大小。
    • 参数:
      • src:输入图像。
      • dsize:输出图像的尺寸。
      • interpolation:插值方法,用于调整图像尺寸。
    • 返回值:调整大小后的图像。
  2. cv2.split()

    • 用于将多通道图像拆分为单通道图像。
    • 参数:输入的多通道图像。
    • 返回值:单通道图像组成的列表。
  3. cv2.merge()

    • 用于将多个单通道图像合并成一个多通道图像。
    • 参数:单通道图像组成的列表。
    • 返回值:合并后的多通道图像。
  4. cv2.VideoWriter()

    • 创建一个视频写入对象,用于将帧写入视频文件。
    • 参数:
      • filename:输出视频文件名。
      • fourcc:视频编码器。
      • fps:帧率。
      • frameSize:视频帧的大小。
    • 返回值:视频写入对象。

NumPy 函数:

  1. np.ones_like()

    • 生成一个与输入数组形状相同的全 1 数组。
    • 参数:输入数组。
    • 返回值:形状相同且元素全为 1 的数组。
  2. np.zeros_like()

    • 生成一个与输入数组形状相同的全 0 数组。
    • 参数:输入数组。
    • 返回值:形状相同且元素全为 0 的数组。
  3. np.round()

    • 对数组中的元素进行四舍五入。
    • 参数:输入数组。
    • 返回值:四舍五入后的数组。
  4. np.power()

    • 计算数组的幂。
    • 参数:输入数组和幂指数。
    • 返回值:幂计算后的数组。

这些函数在实现聚光灯效果的过程中起着重要的作用,通过它们可以对图像进行大小调整、颜色分离、视频写入等操作。

三、简单动态聚光灯效果案例实现简单步骤

1、编写代码,先看看一个聚光灯移动的效果

2、运行效果

3、具体代码

"""
单个聚光等在视频中移动的效果
"""import cv2
import numpy as npdef apply_spotlight(frame, spotlight_pos):"""在视频帧上应用动态聚光灯效果:param frame: :param spotlight_pos: :return: """# 创建一个黑色图像,与原始视频帧相同大小spotlight_mask = np.zeros_like(frame)# 在黑色图像上绘制一个白色的椭圆,模拟聚光灯光圈cv2.ellipse(spotlight_mask, spotlight_pos, (100, 100), 0, 0, 360, (255, 255, 255), -1)# 将光圈图像与原始视频帧进行叠加result_frame = cv2.addWeighted(frame, 1, spotlight_mask, 0.5, 0)return result_framedef main():# 打开视频文件cap = cv2.VideoCapture('Videos/CatRun.mp4')# 获取视频帧率和尺寸fps = cap.get(cv2.CAP_PROP_FPS)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.mp4', fourcc, fps, (width, height))# 初始化聚光灯位置spotlight_pos = (int(width / 2), int(height / 2))# 逐帧处理视频while cap.isOpened():ret, frame = cap.read()if not ret:break# 应用动态聚光灯效果frame_with_spotlight = apply_spotlight(frame, spotlight_pos)# 写入输出视频out.write(frame_with_spotlight)# 更新聚光灯位置(示例中简单地沿着视频宽度方向移动)spotlight_pos = ((spotlight_pos[0] + 5) % width, spotlight_pos[1])# 释放资源cap.release()out.release()cv2.destroyAllWindows()if __name__ == "__main__":main()

4、编写代码,实现多个聚光灯动态移动效果

5、运行效果

6、具体代码

"""
简单动态聚光灯效果1、apply_spotlights(frame, spotlights):这个函数用于在视频帧上应用多盏聚光灯效果。参数:frame:输入的视频帧,是一个 numpy 数组。spotlights:包含多盏聚光灯信息的列表。每个聚光灯由位置、颜色、移动角度和速度组成。返回值:处理后的视频帧,应用了聚光灯效果。2、main():这个函数是程序的主函数,用于读取输入视频并逐帧处理,添加聚光灯效果后写入输出视频。主要步骤:读取输入视频文件。初始化输出视频文件。创建并初始化多盏聚光灯的信息。逐帧读取输入视频,应用聚光灯效果并写入输出视频。更新每盏聚光灯的位置。函数调用:调用了apply_spotlights()函数来添加聚光灯效果。
"""import cv2
import numpy as np
import random
import mathdef apply_spotlights(frame, spotlights):"""在视频帧上应用多盏聚光灯效果:param frame::param spotlights::return:"""result_frame = frame.copy()# 在每一盏聚光灯上叠加光斑for spotlight in spotlights:spotlight_pos, spotlight_color, _, _ = spotlight  # 保留移动方向和速度,但在此不使用spotlight_mask = np.zeros_like(frame)cv2.ellipse(spotlight_mask, spotlight_pos, (150, 150), 0, 0, 360, spotlight_color, -1)result_frame = cv2.addWeighted(result_frame, 1, spotlight_mask, 0.5, 0)return result_framedef main():video_path = "Videos/CatRun.mp4"output_path = "Videos/VideoSpotLightEffect.mp4"# 打开视频文件cap = cv2.VideoCapture(video_path)# 获取视频帧率和尺寸fps = cap.get(cv2.CAP_PROP_FPS)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_path, fourcc, fps, (width, height))# 初始化聚光灯列表,每一盏聚光灯由位置、颜色、移动角度和速度组成spotlights = []for _ in range(5):  # 创建5盏聚光灯spotlight_pos = (random.randint(0, width - 1), random.randint(0, height - 1))spotlight_color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))# 随机选择一个移动角度和速度angle = random.uniform(0, 2 * math.pi)speed = random.randint(3, 10)spotlights.append((spotlight_pos, spotlight_color, angle, speed))# 逐帧处理视频while cap.isOpened():ret, frame = cap.read()if not ret:break# 应用多盏聚光灯效果frame_with_spotlights = apply_spotlights(frame, spotlights)# 写入输出视频out.write(frame_with_spotlights)# 更新每一盏聚光灯的位置for i in range(len(spotlights)):# 获取当前聚光灯的位置、颜色、移动角度和速度spotlight_pos, spotlight_color, angle, speed = spotlights[i]# 根据移动角度和速度更新聚光灯位置dx = int(speed * math.cos(angle))dy = int(speed * math.sin(angle))new_x = min(max(0, spotlight_pos[0] + dx), width - 1)new_y = min(max(0, spotlight_pos[1] + dy), height - 1)# 如果聚光灯到达视频边缘,随机选择一个新的移动角度和速度if new_x in [0, width - 1] or new_y in [0, height - 1]:angle = random.uniform(0, 2 * math.pi)speed = random.randint(3, 10)# 更新聚光灯列表中的聚光灯信息spotlights[i] = ((new_x, new_y), spotlight_color, angle, speed)# 释放资源cap.release()out.release()cv2.destroyAllWindows()if __name__ == "__main__":main()

四、注意事项

  1. 聚光灯移动

    • 确保聚光灯移动的速度和角度自然,避免抖动和突然变化,使得效果更真实。
  2. 边界处理

    • 当聚光灯移动到视频边缘时,要确保正确地处理边界情况,防止越界。
  3. 效率优化

    • 考虑到处理视频的效率,尽量使用向量化操作和适当的数据结构,减少循环和不必要的计算。
  4. 颜色随机性

    • 聚光灯的颜色应该是随机生成的,以增加效果的多样性和真实感。
  5. 参数调整

    • 可以调整聚光灯的数量、移动速度范围、移动角度范围等参数,以获得更满意的效果。

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

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

相关文章

Mysql视图与事物与字符集实验

一 视图 1.视图的定义 视图是一个虚拟表,其内容由查询定义。 2.视图的优点 1)视点集中 2)简化操作 3)定制数据 4)分隔合并数据 5)安全性好 3.语法格式及限定条件 1)语法格式&#xff1…

轻量化模块整理,即插即用

轻量化模块整理,即插即用(持续更新) 整理一些轻量化的结构,作为知识储备,可以用到后续的项目和研究中 Mobilenetv3 深度可分离卷积 MobileNetV3 是一个轻量级的深度学习模型,专为移动和边缘设备上的高效…

力扣HOT100 - 56. 合并区间

解题思路: class Solution {public int[][] merge(int[][] intervals) {// 先按照区间起始位置排序Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);int[][] res new int[intervals.length][2];int idx -1;for (int[] interval : intervals) {//直接加入的…

CSS基础之伪类选择器(如果想知道CSS的伪类选择器知识点,那么只看这一篇就足够了!)

前言:学习CSS就必须要学习选择器,在之前我们已经学习了基本选择器和复合选择器,但是还有几个选择器没有学习,这篇文章主要讲解伪类选择器。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-…

基于springboot实现视频网站管理系统【项目源码+论文说明】计算机毕业设计

基于springboot实现视频网站管理系统演示 摘要 使用旧方法对视频信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在视频信息的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问…

顶顶通呼叫中心中间件(mod_cti基于FreeSWITCH)-回铃音补偿

文章目录 前言联系我们解决问题操作步骤 前言 回铃音: 当别人打电话给你时,你的电话响铃了,而他听到的声音叫做回铃音。回铃音是被叫方向主叫方传送,也是彩铃功能的基础。我们平时打电话听到的“嘟 嘟 嘟 嘟”的声音,就…

asp.net core 网页接入微信扫码登录

创建微信开放平台账号&#xff0c;然后创建网页应用 获取appid和appsecret 前端使用的vue&#xff0c;安装插件vue-wxlogin 调用代码 <wxlogin :appid"appId" :scope"scope" :redirect_uri"redirect_uri"></wxlogin> <scri…

机器学习和深度学习 --李宏毅(笔记与个人理解)Day 18

Day 18 Spatial Transformer Layer 因为单纯的cNN无法做到scaling&#xff08;放大&#xff09;and rotation&#xff08;转&#xff09;&#xff0c;所以我们引入&#xff1b; 实战中也许我们可以做到 是因为 我们的training data 中包含了对data 的augmentation&#xff1b; …

解锁智能未来:用Ollama开启你的本地AI之旅

Ollama是一个用于在本地运行大型语言模型&#xff08;LLM&#xff09;的开源框架。它旨在简化在Docker容器中部署LLM的过程&#xff0c;使得管理和运行这些模型变得更加容易。Ollama提供了类似OpenAI的API接口和聊天界面&#xff0c;可以非常方便地部署最新版本的GPT模型并通过…

企业邮箱价格调查:找到适合你的最佳选择

企业邮箱价格从免费到几百元的都有&#xff0c;价格不同获得的功能和服务也不同&#xff0c;按需购买。企业邮箱多少钱一年&#xff1f;企业邮箱价格。Zoho Mail企业邮箱轻量版300元/5用户/年&#xff0c;高级版200元/用户/年&#xff0c;套件版150元/用户/元。具体的价格取决于…

《HF经理》:一、管理误区

1、不善授权: 原因&#xff1a;不信任下属&#xff0c;惯性思维&#xff08;任务一来自己冲到最前面&#xff09; 对策&#xff1a;从个人成功到带领团队成功。培养并信任下属。 2、不主动寻求上级支持: 原因&#xff1a;上级不仅仅是你的监督和考核者&#xff0c;还是你的支…

计算机网络 Cisco静态路由实验

一、实验要求与内容 1、路由器的基本配置 &#xff08;1&#xff09;命名 &#xff08;2&#xff09;关闭域名解析 &#xff08;3&#xff09;设置路由接口IP地址 2、配置静态路由以实现所有客户机都能互相通信 3、配置默认路由 4、了解ping命令和trace&#xff08;跟踪…

基于SpringBoot的“外卖点餐系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“外卖点餐系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能图 用户功能界面 订单管理界面 配送单管…

设计模式——迭代器模式15

迭代器模式提供一种方法访问一个容器对象中各个元素&#xff0c;而又不需暴露该对象的内部细节。 设计模式&#xff0c;一定要敲代码理解 抽象迭代器 /*** 迭代抽象* */ public interface Iterator<A> {A next();boolean hasNext(); }迭代器实现 /*** author ggbond*…

极市平台 | 卫星图像公开数据集资源汇总

本文来源公众号“极市平台”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;卫星图像公开数据集资源汇总 本文收集整理了卫星图像的开源数据集&#xff0c;多用于图像分割方向&#xff0c;希望能给大家的学习带来帮助。 1 水体卫…

DHCP是什么意思 路由器中DHCP服务器怎么设置?

概述 DHCP是什么意思&#xff1f;很多朋友在路由器设置中&#xff0c;都会看到有一项“DHCP服务器”设置功能&#xff0c;而很多朋友对这个功能不太了解&#xff0c;也不知道怎么设置。其实&#xff0c;对于普通用户来说&#xff0c;无需去单独设置路由器DHCP服务器功能&#…

CMake快速入门

文章目录 目的环境准备快速入门总结 目的 C/C的代码可以直接使用编译工具链进行编译&#xff0c;这种方式文件一多就不方便了。也可以编写 Makefile 然后使用 make 进行编译&#xff0c;当然写 Makefile 其实也挺繁琐。对于大型项目比较流行的是编写 CMakeLists.txt 然后使用 …

SpringBoot中注册Bean的方式汇总

文章目录 ComponentScan Componet相关注解BeanImportspring.factories总结Configuration和Component的主要区别&#xff1f;Bean是不是必须和Configuration一起使用&#xff1f;Import导入配置类有意义&#xff1f;出现异常&#xff1a;java.lang.NoClassDefFoundError: Could…

大语言模型总结整理(不定期更新)

《【快捷部署】016_Ollama&#xff08;CPU only版&#xff09;》 介绍了如何一键快捷部署Ollama&#xff0c;今天就来看一下受欢迎的模型。 模型简介gemmaGemma是由谷歌及其DeepMind团队开发的一个新的开放模型。参数&#xff1a;2B&#xff08;1.6GB&#xff09;、7B&#xff…

文心一言 VS 讯飞星火 VS chatgpt (236)-- 算法导论17.3 2题

二、使用势能法重做练习17.1-3。练习17.1-3的内容是&#xff1a;假定我们对一个数据结构执行一个由 n 个操作组成的操作序列&#xff0c;当 i 严格为 2 的幂时第 i 个操作的代价为 i &#xff0c;否则代价为1。使用聚合分析确定每个操作的摊还代价。如果要写代码&#xff0c;请…