📅  最后修改于: 2023-12-03 14:49:22.947000             🧑  作者: Mango
有时我们需要将一组图像序列合并在一起并制作成动画,以便更好地展示或演示。本文将介绍如何使用Python创建动画,并将其保存为GIF或视频格式。
在运行代码之前,我们需要安装一些库。
!pip install opencv-python==4.4.0.42
!pip install matplotlib==3.3.2
!pip install numpy==1.19.2
!pip install Pillow==8.0.1
!pip install imageio==2.9.0
!pip install moviepy==1.0.3
我们首先需要一些示例图像来创建动画。这里我们将使用一个简单的示例,一组小人在演奏音乐。
import numpy as np
import cv2
# 创建示例图像
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
img_height, img_width = 200, 300
img = np.zeros((img_height, img_width, 3), dtype=np.uint8)
# 绘制小人
x, y = 100, 80
radius = 50
cv2.circle(img, (x, y), radius, WHITE, thickness=-1)
cv2.line(img, (x, y), (x, y+100), WHITE, thickness=6)
cv2.line(img, (x-radius//2, y+50), (x+radius//2, y+50), WHITE, thickness=6)
cv2.circle(img, (x-radius//2, y+50), radius//6, WHITE, thickness=-1)
cv2.circle(img, (x+radius//2, y+50), radius//6, WHITE, thickness=-1)
# 显示图像
from matplotlib import pyplot as plt
plt.imshow(img)
plt.show()
显示的效果是这样的:
创建一个动画序列,可以使用类似下面的代码。
frames = []
# 添加第1帧
frames.append(img)
# 添加第2-20帧
for i in range(1, 20):
# 复制上一帧
newimg = img.copy()
# 修改新帧
angle = i * 10
M = cv2.getRotationMatrix2D((x, y), angle, 1.0)
newimg = cv2.warpAffine(newimg, M, (img_width, img_height))
# 添加新帧到列表
frames.append(newimg)
这个代码将使用cv2.getRotationMatrix2D
函数从初始图像创建19个新图像,每个图像都将被旋转10度。
我们可以使用moviepy库将动画保存为GIF格式。
import moviepy.editor as mp
# 将图像序列转换为视频
animation = mp.ImageSequenceClip(frames, fps=10)
# 保存为GIF格式
animation.write_gif("animation.gif")
这将在当前目录下保存一个名为“animation.gif”的文件。你可以双击它来查看你的动画。
我们可以使用imageio库将动画保存为视频格式。
import imageio
# 保存图像序列到视频
fps = 10
writer = imageio.get_writer("animation.mp4", fps=fps)
for frame in frames:
writer.append_data(frame)
writer.close()
这将在当前目录下保存一个名为“animation.mp4”的文件。你可以使用任何视频播放器来查看你的动画。
使用Python创建动画非常容易。你只需要创建一个图像序列并将其保存为GIF或视频格式。如果你认为这篇文章有用,请分享给你的朋友们吧!