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

MATLAB getframe捕获屏幕上的任何内容,matlab,video,screen-capture,avi,Matlab,Video,Screen Capture,Avi,我正试图从我的MATLAB情节中创建一部电影。当我调用getframe时,它“通常”捕获绘图图像,但有时如果屏幕上有其他活动的内容(如果我继续使用计算机,这是正常的),它会捕获任何活动的窗口。有没有其他方法可以抓取活动人物的图像 e、 g 您可以将所需图形或轴的渲染器传递到,以确保它不会捕获其他窗口。我可能取决于您使用的渲染器。如果它是'painters',那么你应该没问题,但是如果它是其他的东西,比如'OpenGL',那么我认为它必须从图形卡获取帧数据,这意味着如果你有一些东西重叠了窗口,那么

我正试图从我的MATLAB情节中创建一部电影。当我调用getframe时,它“通常”捕获绘图图像,但有时如果屏幕上有其他活动的内容(如果我继续使用计算机,这是正常的),它会捕获任何活动的窗口。有没有其他方法可以抓取活动人物的图像

e、 g


您可以将所需图形或轴的渲染器传递到,以确保它不会捕获其他窗口。

我可能取决于您使用的渲染器。如果它是
'painters'
,那么你应该没问题,但是如果它是其他的东西,比如
'OpenGL'
,那么我认为它必须从图形卡获取帧数据,这意味着如果你有一些东西重叠了窗口,那么可能最终会出现在
getframe
的输出中,找到了解决方案;而不是

aviobj = addframe(aviobj, getframe(fig));
将图形句柄直接发送到addframe就足够了:

aviobj = addframe(aviobj, fig);

正如有人已经说过的,您不必使用getframe,但是如果您坚持使用它,您可以使用它

set(fig,'Renderer','zbuffer')

这将解决您的问题。

如果您在许多子批次中使用
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)

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);

@保尔·西蒙斯:你能添加一个代码示例来显示你在做什么吗?这是在Windows上吗?您是否正在进行任何类型的复杂绘图,如透明面片或其他可能使用OpenGL渲染的详细图形?是的,它是windows,不,不,不复杂图形。奇怪吗,我是唯一一个看到这一切的人?我在两个不同的窗口框中也遇到了同样的问题,但那一次,让计算机继续运行并离开是可以的,所以我不关心很多相关的问题:仅供参考,设置(gcf,‘渲染器’、‘画师’);aviobj=addframe(aviobj,getframe(gcf));也不起作用…@paulsimmons:你在传递手柄时使用的是
gcf
还是
fig
?问题中是
fig
,但您的评论中是
gcf
。好吧,gcf实际上是一个“获取当前图形”的函数,它在我的case@paulsimmons:是的,但如果在制作电影时,除
fig
之外的另一个人物因任何原因成为当前人物,然后,
gcf
将引用该选项。很好,您找到了一个解决方法。我只是想知道是什么首先导致了这个问题。也许一个bug报告已经准备好了。我只是尝试了一下,但没有成功。我在Mac OSX的R2010b上。figure窗口在dock后面(和我屏幕上的其他东西一样),dock出现在我的视频中。
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);