Mayavi通过Moviepy输出动画
Posted dalanjing
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mayavi通过Moviepy输出动画相关的知识,希望对你有一定的参考价值。
1,准备
首先得安装Mayavi,看我之前的帖子,链接。
然后安装Moviepy,pip install moviepy. 关于Moviepy怎么用,可以见官网。
2,思路
通过Mayavi绘制每一帧的图片,然后Moviepy获取到每一帧,生成视频文件。
3,示例
1 import numpy as np 2 import mayavi.mlab as mlab 3 import moviepy.editor as mpy 4 5 duration= 2 # duration of the animation in seconds (it will loop) 6 7 # 使用MAYAVI先创建一个图片 8 fig_myv = mlab.figure(size=(220,220), bgcolor=(1,1,1)) 9 X, Y = np.linspace(-2,2,200), np.linspace(-2,2,200) 10 XX, YY = np.meshgrid(X,Y) 11 ZZ = lambda d: np.sinc(XX**2+YY**2)+np.sin(XX+d) 12 13 # 使用MoviePy把这个图片创建为一个动画,并保存 14 def make_frame(t): 15 mlab.clf() # clear the figure (to reset the colors) 16 mlab.mesh(YY,XX,ZZ(2*np.pi*t/duration), figure=fig_myv) 17 #下面两句很重要 18 f = mlab.gcf() 19 f.scene._lift() 20 return mlab.screenshot() #antialiased=True 21 22 animation = mpy.VideoClip(make_frame, duration=duration) 23 animation.write_gif("sinc.gif", fps=20)
值得注意的是,很多地方提供了类似于上面的代码,但是运行时会报错:“ValueError: cannot reshape array of size 12 into shape (0,0,3)”
解决办法是在 返回screenshot()前添加两行代码
1 f = mlab.gcf() 2 f.scene._lift()
运行结果如下
4,示例二
将我之前博客中的例子转换成动画
1 import mayavi.mlab as mlab 2 import numpy as np 3 from moviepy.editor import VideoClip 4 5 fig=mlab.figure(size=(200,200),bgcolor=(1.0,1.0,1.0)) 6 duration = 5 7 #生成20个点坐标 8 t = np.linspace(0, 4 * np.pi, 20) 9 x = np.sin(2 * t) 10 y = np.cos(t) 11 z = np.cos(2 * t) 12 s = 2 + np.sin(t) 13 14 def make_frame(t): 15 mlab.clf() 16 # # s数组只移动一位,点的颜色也就会变换 17 b = s[19] 18 s[1:20]=s[0:19] 19 s[0] = b 20 f = mlab.gcf() 21 f.scene._lift() 22 mlab.points3d(x, y, z, s, mode="cube",scale_mode="none", colormap="spectral", scale_factor=.5) 23 mlab.view(azimuth= 180*t/duration, distance=9) # camera angle 24 return mlab.screenshot(antialiased=True) 25 26 # duration是gif时长 27 animation = VideoClip(make_frame, duration=duration) 28 # fps帧率 29 animation.write_gif(‘rot.gif‘, fps=3)
本来小球的颜色是由s变量控制的,每一帧将s数组中的数平移一位,这样颜色点的颜色就能变化了。每一秒3帧,mlab.view控制相机变换。
运行结果如下
PS: Matplotlib输出动画
与Mayavi输出动画思路是一模一样的,区别在于返回每一帧图像的函数不同。
1 import matplotlib.pyplot as plt 2 import numpy as np 3 from moviepy.editor import VideoClip 4 from moviepy.video.io.bindings import mplfig_to_npimage 5 6 x = np.linspace(-2, 2, 200) 7 8 duration = 2 9 10 fig,ax = plt.subplots() 11 def make_frame(t): 12 ax.clear() 13 ax.plot(x, np.sin(x**2) + np.sin(x + 2*np.pi/duration * t), lw=3) 14 ax.set_ylim(-1.5, 2.5) 15 return mplfig_to_npimage(fig) 16 17 animation = VideoClip(make_frame, duration=duration) 18 animation.write_gif("matplotlib.gif", fps=4)
运行结果:
以上是关于Mayavi通过Moviepy输出动画的主要内容,如果未能解决你的问题,请参考以下文章
Moviepy输出视频MP4文件Windows媒体播放器播放无画面只有声音问题的解决办法