我正在尝试从我的MATLAB图中创建一部电影。当我打电话给getframe时,通常"通常"捕获绘图图像,但有时如果屏幕上还有其他活动(如果我继续使用计算机则这是正常的)它会捕获任何活动窗口。是否有其他方法可以获取活动人物的图像?
e.g。
fig = figure;
aviobj = avifile('sample.avi','compression','None');
for i=1:t
clf(fig);
plot(...); % some arbitrary plotting
hold on;
plot(...); % some other arbitrary plotting
axis([0 50 0 50]);
aviobj = addframe(aviobj, getframe(fig));
end
aviobj = close(aviobj);
答案 0 :(得分:4)
aviobj = addframe(aviobj, getframe(fig));
将数字句柄直接发送到addframe就足够了:
aviobj = addframe(aviobj, fig);
答案 1 :(得分:3)
Matlab人员显然正在逐步淘汰未来版本中的avifile和addframe功能,分别用VideoWriter和writeVideo取而代之。不幸的是,这意味着接受的答案将不再有效,因为writeVideo不接受数字句柄作为参数。
我已经玩了一下,为了将来参考,使用未记录的硬拷贝功能可以完成同样的事情。以下代码对我来说非常合适,还有一个额外的好处,即使没有弹出一个绘图窗口,所以它完全在后台完成所有工作:
fig = figure('Visible','off');
set(fig,'PaperPositionMode','auto');
writerobj = VideoWriter('sample.avi','Uncompressed AVI');
open(writerobj);
for i=1:t
clf(fig);
plot(...); % some arbitrary plotting
hold on;
plot(...); % some other arbitrary plotting
axis([0 50 0 50]);
figinfo = hardcopy(fig,'-dzbuffer','-r0');
writeVideo(writerobj, im2frame(figinfo));
end
close(writerobj);
答案 2 :(得分:1)
答案 3 :(得分:1)
我可能依赖于您正在使用的渲染器。如果它是'painters'
,那么你应该没问题,但如果它是其他任何东西,比如'OpenGL'
,那么我认为它必须从显卡获取帧数据,这意味着如果你有东西重叠窗口,然后可能会在getframe
的输出中结束。
答案 4 :(得分:0)
正如有人已经声明你不必使用getframe,但如果你坚持使用它,你可以使用
set(fig,'Renderer','zbuffer')
这应该可以解决您的问题。
答案 5 :(得分:0)
如果在许多子图中使用getframe
,请尝试在最后添加:
我认为get框架工作正常,只是渲染有点未定位。
clf(fig)
% use 1st frame to get dimensions
[h, w, p] = size(frames(1).cdata);
hf = figure;
% resize figure based on frame's w x h, and place at (150, 150)
set(hf,'Position', [150 150 w h]);
axis off
% Place frames at bottom left
movie(hf,frames,4,30,[0 0 0 0]);
close(gcf)