Pythonでグラフのアニメを作る(OpenCVでmp4ファイルを出力編)

Pythonのmatplotlibで描いたグラフをOpenCVを使ってmp4ビデオファイル出力します。

目次

  1. グラフの遷移をアニメーションで表現する方法
  2. アニメーション作成例

グラフの遷移をアニメーションで表現する方法

以前の投稿でmatplotlibで描いたリサジュー図形を imagemagickを使ったり 連番ファイルを使ったり してGIFアニメーションに出力していました。

ただ、Imagemagickはバージョンによってコマンドが変わったりしますし、連番ファイルに出力するのもちょっと手間でした。

ということで Pillowを使ってGIFアニメーションを出力 もしました。ただ、GIFアニメはきれいなのですが、ファイルサイズが大きいのが難です。

そこで、OpenCVを使ってmp4出力してみます。

具体的には、matplotlibで描いたグラフをndarrayに変換して、そのndarrayをOpenCV-PythonのVideoWriterに出力します。matplotlibからndarrayへの変換については、 こちらの投稿 を参照してください。

アニメーション作成例

以前の投稿と同じリサジュー図形のアニメーションを出力します。

import numpy as np
import matplotlib.pyplot as plt
import cv2

# OpenCVの設定
fourcc = cv2.VideoWriter_fourcc('m','p','4','v')
video = cv2.VideoWriter('out.mp4', fourcc, 20.0, (300, 300))

theta = np.linspace(0, 2*np.pi, 201)
delta_theta = np.linspace(0, 2*np.pi, 201)
b = 1.0
muki = True

for i in delta_theta:
    x = np.cos(theta)
    y1 = np.sin(theta + i)
    y2 = np.sin(b*theta)
    y3 = np.sin(2*theta + i)

    # 描画
    fig = plt.figure(figsize=(3,3))
    plt.plot(x, y1, 'b', x, y2, 'g', x, y3, 'r')
    fig.canvas.draw()

    # VideoWriterへ書き込み
    image_array = np.array(fig.canvas.renderer.buffer_rgba())
    # image_array = np.array(fig.canvas.renderer._renderer) # matplotlibが3.1より前の場合
    im = cv2.cvtColor(image_array, cv2.COLOR_RGBA2BGR)
    video.write(im)
    plt.close()

    if muki is True:
        b = b + 0.05
        if b > 6:
            muki = False
    else:
        b = b - 0.05

video.release

OpenCVとmatplotlibでndarrayの色(RGB)の並びが異なるというところが注意点ですね。

出力はこうなります。

公開日

広告