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 图像

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

对象的特征通知处理程序发生异常:,特征: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.81666362e45937613e-01 1.81666362e-01 2.1651e4562e-01 2.1651e- -01。. . 这重复了很多次。同时 Mayavi 场景确实显示,并且在此错误继续时显示图像旋转

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

4

2 回答 2

0

查看错误消息,似乎 Mayavi 在生成场景时遇到了问题,可能是您的网格表面、三角形网格等有问题。

您是否尝试过在没有 MoviePy 的情况下使用不同参数生成场景,看看它是否有效?

于 2015-09-05T09:49:12.367 回答
-1

我不知道moviepy在做什么,我从来没有使用过moviepy。

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

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

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

  2. 使用 eg 在 mayavi 中设置动画,并@mlab.animate使用诸如ffmpeg -i x11grab.

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

于 2015-09-04T22:39:37.963 回答