在MayaVi中保存多张图像

17 投票
1 回答
1569 浏览
提问于 2025-04-18 09:39

我想处理大约500张图片,并把它们保存成不同的png文件,所以我写了一个小类,里面包含了我的数据集和一个渲染函数。

from mayavi import mlab
mlab.options.offscreen=True

class Dataset(object):
    def __init__(self):
        some init stuff etc

                 .
                 .
                 .
                 .

    def save_current_frame_to_png(self, filename):
        mlab.contour3d(self.frame_data, contours =30, opacity=0.2) 
        mlab.savefig(filename)
        mlab.clf()
        mlab.close()
        gc.collect()

    def create_movie_files(self):
        folder_name = "animation"
        try:
            os.makedirs(folder_name)
        except OSError:
            raise OSError("Directory already exists.")

        self.__go_to_first_frame()

        for i in range(self.frames):
            filename = "".join([folder_name, "/%.5i" % i, ".png"])
            print filename
            self.save_current_frame_to_png(filename)
            self.read_single_frame()

        self.__go_to_first_frame()

一切看起来都很正常,但后来我查看了一下内存使用情况,发现它一直在增加,直到系统崩溃。我尝试使用 mlab.clf()gc.collect() 来保持内存低,但效果不佳。我找到一个用 mlab.close() 的解决办法,这似乎对内存使用有帮助,但又带来了一个新问题。每次渲染新图像时,mayavi 也会创建一个新窗口,所以大约200个窗口后,程序就崩溃了。有没有办法完全禁用这些窗口?我觉得 mlab.options.offscreen=True 只是禁用了在当前窗口内的绘图。

补充说明:self.frame_data 是一个形状为 (100,100,100) 的numpy数组,而 self.read_single_frame() 只是从文本文件中读取下一帧并存储到 self.frame_data 中。这些函数不会增加内存使用,如果我关闭渲染,内存使用率保持在1.2%。

1 个回答

0

你应该把 mlab.show() 隐藏起来,同时保留 mlab.close()。这样就能正常工作了。

撰写回答