Как кодировать внутренний цикл, чтобы получить только непустые кадры фильма в Matlab? - PullRequest
0 голосов
/ 12 июня 2018

В своем коде построения я использую цикл for

frame(S) = struct('cdata',[],'colormap',[]);    % pre-allocate frames structure

for i = 1 : round(N/S) : N

some plotting code..

axis equal 

drawnow;

frame(i) = getframe();

end

, а затем использую VideoWriter:

video = VideoWriter('My_movie.avi', 'Uncompressed AVI');

video.FrameRate = 60;

open(video)

writeVideo(video, frame);

hold off 

close(video);

Но я получаю ошибку

Поле 'cdata' в FRAME не должно быть пустым.

Я знаю, в чем проблема, но не знаю, как ее решить.

Значения для i1,5,9,13 ...

, что означает, что кадры 2,3,4,6,7,8,10,11,12 и т. д. будут пустыми.

Я думаю, что мне нужен внутренний цикл, непосредственно перед тем, как я вызываю функцию getframe (), но я не уверен, как это сделать правильно и, возможно, выполнить итерацию по индексу.

В настоящее время я пытался кодировать этот внутренний цикл:

for j = 1:S

frame(j) = getframe();

end

Однако из-за этого внутреннего цикла симуляция теперь выполняется крайне медленно.

1 Ответ

0 голосов
/ 12 июня 2018

При кодировании цикла вы не назначаете данные каждому кадру.Вы предварительно выделяете S кадров (номера кадров 1 - S), но затем назначаете данные для S кадров с индексами 1 до N (N>S).Это не имеет смысла для меня.

Но, похоже, вы используете i также для рисования анимации, где вы хотите пропустить «кадры».

Способ сделать это правильновыглядит так:

frame(S) = struct('cdata',[],'colormap',[]);    % pre-allocate frames structure
for j = 1:S
   i = j * round(N/S);
   % some plotting code..
   axis equal 
   drawnow;
   frame(j) = getframe();
end

Здесь каждому кадру в диапазоне 1:S назначены данные, но i все равно пропускает значения, как в вашем коде.

...