zoukankan      html  css  js  c++  java
  • 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)

    运行结果:

     

  • 相关阅读:
    再谈PHP、Python与Ruby
    php消息队列
    创业如同追女生:成功的创业者都是追女生好手
    Windows 下 Python easy_install 的安装
    常用Python第三方库 简介
    Highcharts使用手册
    sqoop java api
    redis 读写分离
    linux 安装redis
    hive 安装和部署
  • 原文地址:https://www.cnblogs.com/dalanjing/p/12293627.html
Copyright © 2011-2022 走看看