MATLAB getframe захватывает все, что на экране - PullRequest
3 голосов
/ 19 декабря 2011

Я пытаюсь создать фильм из моего сюжета MATLAB.Когда я вызываю getframe, он «обычно» захватывает изображение графика, но иногда, если на экране что-то еще активно (что нормально, если я продолжаю пользоваться компьютером), он захватывает любое активное окно.Есть ли другой способ получить изображение активной фигуры?

например

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 ]

4 голосов
/ 19 декабря 2011

ОК, найдено решение; вместо

aviobj = addframe(aviobj, getframe(fig));

достаточно отправить дескриптор рисунка непосредственно в addframe:

aviobj = addframe(aviobj, fig);
3 голосов
/ 05 августа 2014

Люди 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);
1 голос
/ 19 декабря 2011

Я могу зависеть от используемого вами средства визуализации.Если это 'painters', то вы должны быть в порядке, но если это что-то еще, например 'OpenGL', то я думаю, что он должен получить данные кадра с видеокарты, что означает, что если у вас есть что-то, перекрывающее окно,тогда это может закончиться на выходе getframe.

1 голос
/ 19 декабря 2011

Вы можете передать дескриптор нужной фигуры или оси в GETFRAME , чтобы убедиться, что он не захватывает другое окно.

0 голосов
/ 25 марта 2014

Если вы используете 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)
0 голосов
/ 19 сентября 2012

Как кто-то уже сказал, вам не нужно использовать getframe, однако, если вы настаиваете на его использовании, вы можете использовать

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

и это должно исправить вашу проблему.

...