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

本文主要是介绍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. 参数调整

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

这篇关于Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之三 简单动态聚光灯效果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/883020

相关文章

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

使用Python实现高效的端口扫描器

《使用Python实现高效的端口扫描器》在网络安全领域,端口扫描是一项基本而重要的技能,通过端口扫描,可以发现目标主机上开放的服务和端口,这对于安全评估、渗透测试等有着不可忽视的作用,本文将介绍如何使... 目录1. 端口扫描的基本原理2. 使用python实现端口扫描2.1 安装必要的库2.2 编写端口扫

使用Python实现操作mongodb详解

《使用Python实现操作mongodb详解》这篇文章主要为大家详细介绍了使用Python实现操作mongodb的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、示例二、常用指令三、遇到的问题一、示例from pymongo import MongoClientf

使用Python合并 Excel单元格指定行列或单元格范围

《使用Python合并Excel单元格指定行列或单元格范围》合并Excel单元格是Excel数据处理和表格设计中的一项常用操作,本文将介绍如何通过Python合并Excel中的指定行列或单... 目录python Excel库安装Python合并Excel 中的指定行Python合并Excel 中的指定列P

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插

mysql外键创建不成功/失效如何处理

《mysql外键创建不成功/失效如何处理》文章介绍了在MySQL5.5.40版本中,创建带有外键约束的`stu`和`grade`表时遇到的问题,发现`grade`表的`id`字段没有随着`studen... 当前mysql版本:SELECT VERSION();结果为:5.5.40。在复习mysql外键约

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用