基于 OpenCV 的简单动画生成器

任务描述
实现了一个基于 OpenCV 的简单动画生成器。它创建了一个黑色背景上的移动正方形,随着时间的推移,正方形的位置和颜色会发生变化,同时还会进行旋转。

任务难点
时间相关变化:确保动画元素的变化与时间同步。
旋转和移动的结合:在正方形移动的同时,进行旋转。

难点解决方案

  1. 时间相关变化的同步
    时间跟踪:使用 time 模块中的时间函数追踪动画运行时间。
    颜色变化:利用正弦和余弦函数生成动态颜色。
    位置变化:基于经过的时间调整正方形的位置。
  2. 移动和旋转结合
    中心点追踪:动态更新旋转的中心点以确保正方形在移动过程中正确旋转。
    角度计算:利用时间对角度进行调整,使得旋转看起来流畅而连续。
    旋转变换:使用 OpenCV 提供的函数实现旋转变换,确保正方形在旋转时不失真。
import cv2
import numpy as np
import time


background = np.zeros((400, 400, 3), dtype=np.uint8)

# 定义一个小正方形的初始位置和大小
square_size = 40
x, y = 180, 180

# 定义动画持续的秒数和每一帧的间隔时间
animation_duration = 10
frame_interval = 0.1

# 动画开始时间
start_time = time.time()

while True:
    # 获取当前时间
    current_time = time.time()

    # 计算已经经过的时间
    elapsed_time = current_time - start_time

    # 如果已经超过动画持续的秒数,退出循环
    if elapsed_time > animation_duration:
        break

    # 计算当前帧的新位置(这里是一个简单的左上角移动示例)
    x += 2
    y += 2

    # 创建一个新的图像
    frame = np.copy(background)

    # 在新图像上绘制小正方形,并使用时间作为颜色变化的参数
    color = (int(127 + 127 * np.sin(elapsed_time)), int(127 + 127 * np.cos(elapsed_time)),
             int(127 + 127 * np.sin(elapsed_time * 0.7)))
    cv2.rectangle(frame, (x, y), (x + int(square_size * np.sin(elapsed_time)), y + square_size), color, -1)

    # 添加旋转变换
    center = (x + square_size // 2, y + square_size // 2)
    angle = (elapsed_time * 50) % 360  # 每秒旋转50度
    rotation_matrix = cv2.getRotationMatrix2D(center, angle, 1)
    frame = cv2.warpAffine(frame, rotation_matrix, (frame.shape[1], frame.shape[0]))

    # 显示当前帧
    cv2.imshow('Animation', frame)
    cv2.waitKey(int(frame_interval * 1000))  # 转换为毫秒

# 关闭窗口
cv2.destroyAllWindows()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值