MatLab, как предварительно выделить кадры для создания фильма? - PullRequest
4 голосов
/ 05 ноября 2011

Matlab имеет следующее руководство по созданию фильма в формате avi.Моя цель - иметь возможность воспроизводить видео в моей презентации через powerpoint.

nFrames = 20;
% Preallocate movie structure.
mov(1:nFrames) = struct('cdata', [],...
                    'colormap', []);

% Create movie.
Z = peaks; surf(Z); 
axis tight
set(gca,'nextplot','replacechildren');
for k = 1:nFrames 
surf(sin(2*pi*k/20)*Z,Z)
mov(k) = getframe(gcf);
end

% Create AVI file.
movie2avi(mov, 'myPeaks.avi', 'compression', 'None');

Я понимаю этот пример и у меня не должно быть сжатия для загрузки в PowerPoint.Однако я не понимаю, как правильно распределить память, используя struct.

Ответы [ 3 ]

3 голосов
/ 07 ноября 2011

Вы можете использовать avifile для создания фильма или даже более новый VideoWriter:

AVIFile

Z = peaks; surf(Z); 
axis tight
set(gca,'nextplot','replacechildren');

vid = avifile('myPeaks.avi', 'fps',15, 'quality',100);
for k = 1:20 
    surf(sin(2*pi*k/20)*Z,Z)
    vid = addframe(vid, getframe(gcf));
end
vid = close(vid);

winopen('myPeaks.avi')

VideoWriter

Z = peaks; surf(Z); 
axis tight
set(gca,'nextplot','replacechildren');

vid = VideoWriter('myPeaks2.avi');
vid.Quality = 100;
vid.FrameRate = 15;
open(vid);
for k = 1:20 
    surf(sin(2*pi*k/20)*Z,Z)
    writeVideo(vid, getframe(gcf));
end
close(vid);

winopen('myPeaks2.avi')
1 голос
/ 06 ноября 2011

Вам не нужно предварительно выделять. Просто инициализируйте mov = []. Также getframe предполагает gcf, поэтому вы можете просто использовать mov(k) = getframe(). Я согласен, что вы хотите несжатый видео. Кодеки, которые идут с Matlab, довольно ограничены. Вы можете использовать инструмент с открытым исходным кодом для сжатия видео, если пространство важно.

0 голосов
/ 07 августа 2015

Вам не нужно предварительно выделять.Раньше он использовался для предварительного выделения с помощью команды moviein, но больше не обеспечивает улучшения производительности.Вот цитата из MATLAB:

>> help moviein
moviein Initialize movie frame memory.
moviein is no longer needed as of MATLAB Release 11 (5.3).  
In previous revisions, pre-allocating a movie increased 
performance, but there is no longer a need to pre-allocate 
movies. To create a movie, use something like the 
following example:

  for j=1:n
     plot_command
     M(j) = getframe;
  end
  movie(M)

For code that is compatible with all versions of MATLAB, 
including versions before Release 11 (5.3), use:

  M = moviein(n);
  for j=1:n
     plot_command
     M(:,j) = getframe;
  end
  movie(M)

See also movie, getframe.
...