MATLAB getframe捕获屏幕上的任何内容

时间:2011-12-19 17:59:23

标签: matlab video screen-capture avi

我正在尝试从我的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);

6 个答案:

答案 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)

您可以将所需图形或轴的handle传递给GETFRAME,以确保它不会捕获另一个窗口。

答案 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)