使用Moviepy给Mayavi添加动画效果

4

我正在尝试找出如何将使用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 通知处理程序中发生异常:对象为:,特征为:y,旧值为:[0.0, 0.0, 1.0, ..., 62.5, 63.0, 63.0],新值为:[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行,在call中: 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)的形状 ERROR:traits:对象的特征通知处理程序发生异常:,特征:y,旧值:[0. 0. 1. ...,新值:[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

从错误信息来看,似乎Mayavi在生成场景时出现了问题,可能是您的网格表面、三角网格等方面存在问题。

您是否尝试使用不同的参数,在没有MoviePy的情况下生成场景,以查看是否可以正常工作?


-1

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

我猜想它可能与我熟悉的某种方法在概念上相似。

有两种方法可以用mayavi创建不同类型的电影,它们都使用像ffmpeg这样的外部工具。

  1. 使用例如mlab.savefig保存许多帧,然后使用像ffmpeg这样的工具将它们拼接在一起。(我猜测moviepy正在执行此操作)

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

我已经成功地尝试过这两种方法。对于使用方法#1的(密集的)示例代码,请参见pysurfer。对于方法二的一些示例代码,请参见cvu


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接