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

目录

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

一、简单介绍

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

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

四、注意事项


一、简单介绍

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

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

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

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

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

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

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

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

2、运行效果

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

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、编写代码,实现多个聚光灯动态移动效果

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

5、运行效果

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

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

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