gpt4 book ai didi

matlab - 在Matlab中生成动画(AVI文件)而不显示图形

转载 作者:行者123 更新时间:2023-11-28 21:43:07 25 4
gpt4 key购买 nike

我一直在尝试通过Matlab的Shell脚本在群集上远程并行生成动画文件(.AVI文件)。到目前为止,这是不可能完成的任务。我几乎放弃了一切,并且刚刚接受了我需要在笔记本电脑上连续8个小时左右的时间来生成动画的过程。但是,我希望那里的人知道如何解决此问题,或者希望我能阻止某人浪费一天的反复试验。

我已经通过数值生成了大量二维概率分布(通过Matlab),我想将这些表面绘制为时间的函数。我知道我可能会尝试输出一堆.jpegs文件并使用另一个程序,例如MEncoder或其他程序,但是该死,这是Matlab应该能够做到的。

我可以访问具有许多节点的漂亮群集,并希望通过shell脚本并行生成动画:

/ usr / local / MATLAB / R2013b / bin / matlab -nojvm -nodisplay -r“ TestFile1”

我知道-nojvm开关将杀死Java,因此我忽略了这一点:

/ usr / local / MATLAB / R2013b / bin / matlab -nodisplay -r“ TestFile1”

我将在下面逐步介绍我的代码,首先在笔记本电脑(新MacBook Pro)上成功运行代码,然后在尝试在群集上运行相同代码时失败。希望有更多使用Matlab经验的人会注意到我的错误,并让我走上正确的道路。

首先,我通过movie2avi取得了成功,下面是一个简单的示例:

%%————————————————————————%%
clear Mov
clear rect
rect = get(gcf,'Position');
rect(1:2) = [0 0];
figure(1)
for ii=1:100
clf;
meshc(((ii+75)/100).*peaks)
grid on
axis([0 50 0 50 -20 20 -10 10])
colorbar
shading interp
Mov(:,ii) = getframe(gcf,rect);
end
movie2avi(Mov, 'test0.avi', 'compression','None','fps',30); % fps = frames per second
%%————————————————————————%%


这种方法的问题在于它使用了getframe,这要求在屏幕上生成绘图。

第二在经过反复试验之后,我能够在笔记本电脑上生成.AVI文件,而无需使用Figure('visible','off')和addframe显示图形。

%%————————————————————————%%
aviobj=avifile('test1.avi','compression','None');
hf= figure('visible','off');
for ii=1:100
clf;
meshc(((ii+75)/100).*peaks)
grid on
axis([0 50 0 50 -20 20 -10 10])
colorbar
shading interp
aviobj=addframe(aviobj,hf);
end
aviobj=close(aviobj);
close(hf);
exit
%%————————————————————————%%


正如我上面提到的,这在我的笔记本电脑上可以很好地工作,但是Matlab消息可以满足:


  警告:AVIFILE将在以后的版本中删除。请改用VIDEOWRITER。


当我尝试在群集上运行此错误消息是:


  使用avifile / addframe> ValidateFrame时出错(第287行)帧必须为660 x 520。


因此,我回到笔记本电脑,为每次循环迭代打印aviobj,看到帧大小始终为Width:560,Height:419。在这一点上,我认为Matlab可能不喜欢AVIFILE,因此我应该尝试使用视频制作人。

第三,我在网上(通过Matlab网站和stackoverflow)找到了一些使用VIDEOWRITER生成动画的示例,但是对于我来说,我一生都无法弄清楚如何在不使用getframe的情况下使用此功能,因此始终显示一个图形。可以在笔记本电脑上工作的一个示例,显示了生成.AVI文件之前的图像,如下所示:

%%————————————————————————%%
writerObj = VideoWriter('test2.avi');
open(writerObj);
Z = peaks; surf(Z);
axis tight
set(gca,'nextplot','replacechildren');
set(gcf,'Renderer','zbuffer');
for k = 1:100
surf(sin(2*pi*k/20)*Z,Z)
frame = getframe;
writeVideo(writerObj,frame);
end
close(writerObj);
%%————————————————————————%%


当然,当我在群集上运行此命令时,会出现预期的错误:


  getframe需要一个有效的图形窗口


我已经看到了很多有关试图将VIDEOWRITER与im2frame而不是getframe一起使用的人的堆栈溢出的例子,但是这些都不起作用,我开始认为VIDEOWRITER与im2frame不兼容。

有没有人解决了类似的问题,如果可以,您可以举一个简单的示例尝试远程运行吗?

编辑:

感谢nkjt,根据您的建议,我能够根据保存在磁盘上的一系列图形创建一个.AVI文件。我已将我的代码放在下面,以供任何有兴趣的人使用。这在我的笔记本电脑和我可以访问的群集上均有效。尽管集群在数字大小方面存在一些问题,但我无法解决。另外,当我使用此代码将图写入我感兴趣的实际情况时,我得到了错误:


  分段故障(核心已转储),


使用-nodisplay开关生成图形时,这似乎很常见。因此,我放弃了,取而代之的是在一夜之间在笔记本电脑上生成了动画。是时候开始使用python而不是Matlab了……

要将图解写入文件:

%%————————————————————————%%
[X,Y] = meshgrid(-3:0.1:3);
Z = peaks(X,Y);
set(gcf,'Visible','off');
for ii=1:100
filename1 = [ 'WTest', num2str(ii),'a.jpg' ];
clf;
meshc(X,Y,((ii+75)/100).*Z)
grid on
axis([-3 3 -3 3 -20 20 -10 10])
colorbar
saveas(gcf,filename1,'jpg');
end
%%————————————————————————%%


要获取保存的绘图文件并制作一个.AVI文件,请执行以下操作:

%%————————————————————————%%
% Take plots to file and make .AVI file
vidObj = VideoWriter('Wtest.avi');
vidObj.Quality = 100; % 0 -- 100
vidObj.FrameRate = 10; % fps
open(vidObj);
set(gcf,'Visible','off');
for ii = 1:100
clf;
filename1 = [ 'WTest', num2str(ii),'a.jpg' ];
img = imread(filename1);
writeVideo(vidObj,img);
end
close(vidObj);
%%————————————————————————%%

最佳答案

如果您能够以无头模式*将单个帧写入图像,则VideoWriter将直接获取图像数据,而无需使用im2frame。但是,您将不得不遍历已写出的图像,将它们读入,将它们添加到电影中,依此类推,因此有些笨拙。

假设fnames按顺序包含所有帧(frame001.jpg等),并且output是您已经使用VideoWriter创建的视频:

for n = 1:length(fnames)
img = imread(fnames(n,:));
writeVideo(output,img);
end
close(output);




* sidenote:并不总是像它第一次出现时那样容易。这可能是在群集上运行 avifile/addframe时出现问题的根源。如果我是您,那么我首先要确保可以令人满意地复制写在带显示器的笔记本电脑上,没有显示器的笔记本电脑上以及群集上写出的单个图像。机器之间的默认图形属性可能会发生变化,并且渲染器的选择(包括硬件与软件OpenGL)可能会引入一些奇怪的效果。

关于matlab - 在Matlab中生成动画(AVI文件)而不显示图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25659782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com