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 np


def 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_frame


def 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 math


def 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_frame


def 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. 参数调整

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM、maven、Nexus

一、jvm简介 1.应用程序申请内存时出现的三种情况: ①OOM:内存溢出,是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。此时程序就运行不了,系统会提示内存溢出&#xff0c…

GPT4.5发布了?OpenAI终于发布正式版Turbo,重回AI王座第一

令人惊讶的是,短短三个月内,全球最强AI的称号又一次易主了!几个月前,Claude3 Opus的性能全面超过了GPT-4,全球网友纷纷转向Claude3,并分享了他们对Claude3的惊艳体验。然而,OpenAI最近再次展示了…

Nginx健康检查

Nginx健康检查nginx_upstream_check_module nginx健康检查介绍: ​ 主动健康检查,nignx定时主动地去ping后端的服务列表,当发现某服务出现异常时,把该服务从健康列表中移除,当发现某服务恢复时,又能够将该服务加回健…

网格(mesh)生成算法

mesh网格生成算法 1. 简介2. Points clouds Vs Meshes3. 为什么要生成mesh网格以及生成mesh网格的难点4. 常见的mesh网格生成算法 1. 简介 基于 3D视觉的新兴应用场景蓬勃发展,3D点云越来越受到人们的广泛关注。点云有着广泛的应用领域包括机器人技术、3D图形、自动…

多模态 ——LLaVA 集成先进图像理解与自然语言交互GPT-4的大模型

概述 提出了一种大型模型 LLaVA,它使用 GPT-4 生成多模态语言图像指令跟随数据,并利用该数据将视觉和语言理解融为一体。初步实验表明,LLaVA 展示了出色的多模态聊天能力,在合成多模态指令上的表现优于 GPT-4。 在科学质量保证中…

Java中volatile关键字

保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的,volatile关键字会强制将修改的值立即写入主存。 1.volatile的可见性 一个典型的例子:永不停止的循环。 public class Forever…

全网最好的JVM总结:有生命周期的JVM

1.编译 1.1 java中编译器有哪些? 前端编译器 javac后台即时编译器 JIT编译器静态提前编译器 (一步到位,直接把java编译成二进制) 2.2 编译过程是怎么样? 解析与填充符号表,生成语法树 (编译…

设计模式学习笔记 - 设计模式与范式 -行为型:17.中介模式:什么时候用中介模式?什么时候用观察者模式?

概述 本章学习 23 种经典设计模式中的最后一个设计模式,中介模式。和之前讲过的命令模式、解释器模式类似,中介模式也不怎么常用,应用场景比较特殊、有限,但是,跟它俩不同的是,中介模式理解起来并不难&…

Linux部署自动化运维平台Spug

文章目录 前言1. Docker安装Spug2 . 本地访问测试3. Linux 安装cpolar4. 配置Spug公网访问地址5. 公网远程访问Spug管理界面6. 固定Spug公网地址 前言 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台,整合了主机管理、主机批量执行、主机在线终端、文件…

【深度学习】多层感知机与卷积神经网络解析

引言: 在人工智能的宏伟画卷中,深度学习如同一笔瑰丽而深邃的色彩,为这幅画增添了无限的生命力和潜能。作为支撑这一领域核心技术的基石,多层感知机(MLP)和卷积神经网络(CNN)在模仿人…

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

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

【漏洞复现】泛微E-Mobile 6.0 client.do存在命令执行漏洞

0x01 阅读须知 “如棠安全的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供…

关于Salesforce DevOps的理解

“DevOps”是一组结合了软件开发 (Dev) 和运营 (Ops) 的实践,可帮助团队更快、更可靠地构建、测试和发布软件。 DevOps 的核心理念包括持续集成(Continuous Integration)、持续交付(…

Docker+Nginx部署vue项目

这篇文章给大家分享一下如何使用DockerNginx部署前端vue项目。 第一步:创建vue项目 执行这个命令,创建一个vue项目 npm create vue3将vue项目打包 npm run build此时会看到vue工程中生成了一个dist文件,我们将他上传到服务器中。 第二步…

步骤大全:网站建设3个基本流程详解

一.领取一个免费域名和SSL证书,和CDN 1.打开网站链接:https://www.rainyun.com/z22_ 2.在网站主页上,您会看到一个"登陆/注册"的选项。 3.点击"登陆/注册",然后选择"微信登录"选项。 4.使用您的…

VMware Workstation部署最新版OpenWrt 23.05.3

正文共:1456 字 51 图,预估阅读时间:2 分钟 我们之前介绍了如何在VMware Workstation上安装OpenWrt(软路由是啥?OpenWrt又是啥?长啥样?在VMware装一个瞅瞅),也介绍了如何…

LRUCache原理及源码实现

目录 LRUCache简介: LRUCache的实现: LinkedHashMap方法实现: 自己实现链表: 前言: 有需要本文章源码的友友请前往:LRUCache源码 LRUCache简介: LRU是Least Recently Used的缩写&#xf…

扣子Coze插件教程:如何使用Coze IDE创建插件

🧙‍♂️ 诸位好,吾乃斜杠君,编程界之翘楚,代码之大师。算法如流水,逻辑如棋局。 📜 吾之笔记,内含诸般技术之秘诀。吾欲以此笔记,传授编程之道,助汝解技术难题。 &#…

通过一篇文章让你了解Linux的重要性

Linux 前言一、什么是Linux后台vs前台为何大多数公司选择使用Linux作为后台服务器 二、Linux的背景介绍UNIX发展的历史Linux发展历史开源官网发行版本DebianUbuntu红帽企业级LinuxCentOSFedoraKali Linux 三、国内企业后台和用户使用Linux现状IT服务器Linux系统应用领域嵌入式L…

每日OJ题_01背包④_力扣1049. 最后一块石头的重量 II

目录 力扣1049. 最后一块石头的重量 II 问题解析 解析代码 滚动数组优化代码 力扣1049. 最后一块石头的重量 II 1049. 最后一块石头的重量 II 有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合,从中选出任意…