使用 Matplotlib 提取电影帧

Beginner

This tutorial is from open-source community. Access the source code

简介

本教程将指导你使用 Matplotlib 从视频中抓取单个帧并将其写入文件的过程。此方法对于生成动画很有用,并且无需集成事件循环即可完成。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。

导入必要的库

我们首先需要导入生成动画所需的必要库。我们将使用 numpy 来生成随机数,使用 matplotlib 进行绘图,并使用 FFMpegWriter 将帧写入文件。

import numpy as np
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
from matplotlib.animation import FFMpegWriter

设置写入器

我们需要设置用于将帧写入文件的写入器。我们设置每秒帧数(fps)并添加诸如标题、作者和注释等元数据。

metadata = dict(title='Movie Test', artist='Matplotlib',
                comment='Movie support!')
writer = FFMpegWriter(fps=15, metadata=metadata)

设置图形

我们创建一个图形,并设置绘图的 x 轴和 y 轴范围。

fig = plt.figure()
plt.xlim(-5, 5)
plt.ylim(-5, 5)

设置绘图

我们创建一个线图,并将初始数据设置为空数组。

l, = plt.plot([], [], 'k-o')

获取帧并写入文件

我们进行 100 次迭代循环,为 x 和 y 坐标生成随机数。我们更新线图的数据,并使用写入器获取帧。最后,我们将帧保存到一个文件中。

x0, y0 = 0, 0

with writer.saving(fig, "writer_test.mp4", 100):
    for i in range(100):
        x0 += 0.1 * np.random.randn()
        y0 += 0.1 * np.random.randn()
        l.set_data(x0, y0)
        writer.grab_frame()

总结

本教程向你展示了如何使用 Matplotlib 从视频中抓取帧并将其写入文件。我们涵盖了从设置写入器到进行迭代循环以及为绘图生成随机数的必要步骤。这种方法对于在不集成事件循环的情况下生成动画很有用。