3

我在stackoverflow中搜索了一个类似的问题,发现了问题“movie2avi-frame-size-error-and-keeping-frame-size-constant”。不幸的是,那里给出的答案并没有解决我的问题(有人建议使用 xlim、ylim 和 zlim)。

在接下来的内容中,我发送了一个对其他地方给出的著名示例进行了轻微修改的版本。

%# figure
figure, set(gcf, 'Color','white')
Z = peaks; surf(Z);  axis tight
set(gca, 'nextplot','replacechildren', 'Visible','off');
[az,el]=view;
xl=xlim;
yl=ylim;
zl=zlim;

%# preallocate
nFrames = 20;
mov(1:nFrames) = struct('cdata',[], 'colormap',[]);

%# create movie
for k=1:nFrames
   view([(az-k*10) el]);
   xlim(xl);ylim(yl);zlim(zl);
   drawnow;pause(0.1);
   mov(k) = getframe(gca);
end
close(gcf)

%# save as AVI file, and open it using system video player
movie2avi(mov, 'myPeaks1.avi', 'compression','None', 'fps',10);

这个想法是旋转图形并创建电影。除了最后一个命令,即movie2avi,一切正常。错误消息是

Error using avifile/addframe>ValidateFrame (line 290)
Frame must be 435 by 344.

Error in avifile/addframe (line 158)
ValidateFrame(aviobj,width, height,dims);

Error in movie2avi (line 67)
avimov = addframe(avimov,mov);

Error in more_video_test (line 24)
movie2avi(mov, 'myPeaks1.avi', 'compression','None', 'fps',10); 

我在 stackoverflow 中查看了在 matlab 中创建视频的方法,发现:

a) 解决方案 ffmpeg 有效,但我想避免它。
b)所有其他解决方案甚至 QTWriter 都失败了。如何修复框架大小以便所有其他解决方案都能正常工作?

非常感谢。

埃德

4

3 回答 3

3

问题在于,由于图形的旋转,轴的大小会发生变化,因此您最终会得到一系列不同大小的帧。如果插入行,您可以看到这一点

s = size(mov(k).cdata);
fprintf('%d %d\n', s(2), s(1))

在循环内,直接在你抓住框架之后

mov(k) = getframe(gca);

结果是

435 344
435 343
435 343
436 342
435 343
435 343
435 343
435 343
435 343
435 343
435 343
435 343
435 343
435 343
435 343
435 343
435 343
435 343
435 343
435 343

由于第一帧的大小为 435 x 344,movie2avi因此预计后续帧的大小相同——但事实并非如此。

为了解决这个问题,您可能需要使用set(gca, 'Position', [...]). 一个更简单的解决方法是不从轴上抓取框架,而是从图中抓取。也就是说,而不是mov(k) = getframe(gca);使用

mov(k) = getframe(gcf);

然后这些帧具有 560 x 420 的统一尺寸。

在我的机器上,生成的 avi 帧倒置。为了解决这个问题,您也可以另外插入一行

mov(k).cdata = mov(k).cdata(end :-1: 1, :, :);

抓住框架后。

于 2013-09-28T14:30:30.980 回答
1

我找到了我的问题的替代解决方案。

%# figure
figure, set(gcf, 'Color','white')
Z = peaks; surf(Z);  axis tight
set(gca, 'nextplot','replacechildren', 'Visible','off');
axis vis3d

% With VideoWriter

writerObj = VideoWriter('myPeaks3.avi');
open(writerObj);

%# preallocate
nFrames = 90;
mov(1:nFrames) = struct('cdata',[], 'colormap',[]);

%# create movie
for k=1:nFrames
   camorbit(360/nFrames,0,'data','z');
   drawnow;
   mov(k) = getframe(gcf);
   writeVideo(writerObj,mov(k));
end;

% Close file

close(writerObj);
于 2013-10-02T16:32:20.493 回答
0

我有同样的问题,在制作视频的过程中帧大小正在改变。在互联网上搜索了很长时间后,我没有找到一个好的解决方案。但是当我尝试在 getframe 调用之后和 writeVideo 调用之前添加drawow时。问题已解决,不再出现。

我正在使用matlab 2017b。

例如

mov(k) = getframe(gcf);
drawnow;
writeVideo(writerObj,mov(k));
于 2019-12-18T14:21:32.790 回答