Pythonでグラフのアニメを作る(OpenCVでmp4ファイルを出力編)
Pythonのmatplotlibで描いたグラフをOpenCVを使ってmp4ビデオファイル出力します。
目次
グラフの遷移をアニメーションで表現する方法
以前の投稿で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)の並びが異なるというところが注意点ですね。
出力はこうなります。
公開日
広告
Pythonでグラフカテゴリの投稿
- Pythonで3Dグラフを描く
- PythonでGIFアニメを作る(PILでアニメーションファイルを出力編)
- Pythonでグラフのアニメを作る(OpenCVでmp4ファイルを出力編)
- Pythonでグラフのコンテナを作る
- Pythonでグラフを描く
- Pythonでグラフ(Matplotlib)のアニメーションを作る(ArtistAnimation編)
- Pythonでグラフ(Matplotlib)のアニメーションを作る(FuncAnimation編)
- PythonのMatplotlibのグラフに領域を指示して最大値と最小値を取得する
- PythonのMatplotlibのグラフに領域を指示して最大値と最小値を取得する(GUI版)
- PythonのMatplotlibのグラフをNumPy行列に変換してOpenCVやPillowで使う
- Pythonのグラフのひな形