动画mayavi与moviepy

时间:2015-09-02 14:16:40

标签: python canopy mayavi moviepy

我正在试图弄清楚如何将使用Mayavi创建的3D绘图导出到可用于Powerpoint等演示文稿的电影中。我在

中找到了使用moviepy进行此操作的讨论

http://zulko.github.io/blog/2014/11/29/data-animations-with-python-and-moviepy/

我使用了这段代码,稍作修改如下

duration = 6
def make_frame(t):
    u = np.linspace(0,2*np.pi,360)                                              
    y = np.sin(3*u)*(0.2+0.5*np.cos(2*np.pi*t/duration))
    pore_surface.mlab_source.set(y = y)                                         
    mlab.view(azimuth= 360*t/duration, distance=200)  
.
.
.
verts, faces = marching_cubes(large_region, 0.5, (1., 1., 1.))
surface_area = mesh_surface_area(verts, faces)
pore_surface = mlab.triangular_mesh([vert[0] for vert in verts],[vert[1] for vert in verts],[vert[2] for vert in verts],faces) 
mlab.show(pore_surface)

animation = mpy.VideoClip(make_frame, duration=duration).resize(0.5)
animation.write_videofile("pore_surface.mp4", fps=20)
animation.write_gif("pore_surface.gif", fps=20)

其中marching_cubes来自scikits image

但是,我收到广播错误,如下所示 (每个新值中有360个值)

对象的traits通知处理程序发生异常:,trait:y,旧值:[0. 0. 1. ...,62.5 63. 63.],新值:[0.00000000e + 00 3.67371235e-02 7.33729915e-02 1.09806628e-01    1.45937613e-01 1.81666362e-01 2.16894399e-01 2.51524628e-01 ...

追踪(最近一次通话):   文件" /Users/iz9/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/traits/trait_notifiers.py" ;,第340行,致电     self.handler(* args)   文件" /Users/iz9/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/mayavi/tools/sources.py" ;,第835行,_y_changed     self.points [:,1] = y.ravel() ValueError:无法将形状(360)的输入数组广播为形状(43505) 错误:特征:对象的特征通知处理程序发生异常:,特征:y,旧值:[0。0. 1. ...,62.5 63. 63.],新值:[0.00000000e + 00 3.67371235e- 02 7.33729915e-02 1.09806628e-01    1.45937613e-01 1.81666362e-01 2.16894399e-01 2.51524628e-01 。 。 。 这反复多次。同时Mayavi场景确实显示,并且它确实显示图像在此错误继续时旋转

我在Mac上的Enthought Canopy下运行Python。

2 个答案:

答案 0 :(得分:0)

查看错误消息,似乎Mayavi在生成场景时出现问题,可能是网格表面,三角形网格等问题。

您是否尝试使用不同的参数生成具有不同参数的场景,以查看它是否有效?

答案 1 :(得分:-1)

我不知道moviepy在做什么,我从未使用过moviepy。

我怀疑它在概念上可能类似于我熟悉的方法。

我知道有两种方法可以用mayavi制作不同类型的电影。他们都使用外部工具,如ffmpeg。

  1. 使用例如保存大量帧mlab.savefig然后将它们与ffmpeg等工具连接在一起。 (我怀疑moviepy正在这样做)

  2. 使用例如mayavi在mayavi中设置动画@mlab.animate并使用ffmpeg -i x11grab等工具捕获屏幕输出。

  3. 我对这两种方法都取得了成功。对于使用方法#1的一些(密集)示例代码,请参阅pysurfer。有关方法二的一些示例代码,请参阅cvu