任务描述
实现了一个基于 OpenCV 的简单动画生成器。它创建了一个黑色背景上的移动正方形,随着时间的推移,正方形的位置和颜色会发生变化,同时还会进行旋转。
任务难点
时间相关变化:确保动画元素的变化与时间同步。
旋转和移动的结合:在正方形移动的同时,进行旋转。
难点解决方案
- 时间相关变化的同步
时间跟踪:使用 time 模块中的时间函数追踪动画运行时间。
颜色变化:利用正弦和余弦函数生成动态颜色。
位置变化:基于经过的时间调整正方形的位置。 - 移动和旋转结合
中心点追踪:动态更新旋转的中心点以确保正方形在移动过程中正确旋转。
角度计算:利用时间对角度进行调整,使得旋转看起来流畅而连续。
旋转变换:使用 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()