Подходы для создания видео в Matlab

Каковы возможности для создания видео в Matlab? Я искал и нашел в основном 3 набора инструментов, которые работают в этой области: обработка изображений, получение изображений и контроль зрения ... но как я могу сделать это без них, просто чтобы создать видео с нуля? Мне интересны различные подходы, чтобы получить обзор, но я не смог найти ни одного достойного учебного пособия или постоянного источника информации в Интернете.

Спасибо за помощь!

Ответы на вопрос(4)

Решение Вопроса

AB.

MOVIE2AVI
%# figure
figure, set(gcf, 'Color','white')
Z = peaks; surf(Z);  axis tight
set(gca, 'nextplot','replacechildren', 'Visible','off');

%# preallocate
nFrames = 20;
mov(1:nFrames) = struct('cdata',[], 'colormap',[]);

%# create movie
for k=1:nFrames
   surf(sin(2*pi*k/20)*Z, Z)
   mov(k) = getframe(gca);
end
close(gcf)

%# save as AVI file, and open it using system video player
movie2avi(mov, 'myPeaks1.avi', 'compression','None', 'fps',10);
winopen('myPeaks1.avi')
AVIFILE

(устарело, используйте VIDEOWRITER вместо)

%# figure
figure, set(gcf, 'Color','white')
Z = peaks; surf(Z);  axis tight
set(gca, 'nextplot','replacechildren', 'Visible','off');

%# create AVI object
nFrames = 20;
aviobj = avifile('myPeaks2.avi', 'fps',10);

%# create movie
for k=1:nFrames
   surf(sin(2*pi*k/20)*Z, Z)
   aviobj = addframe(aviobj, getframe(gca));
end
close(gcf)

%# save as AVI file, and open it using system video player
aviobj = close(aviobj);
winopen('myPeaks2.avi')
VIDEOWRITER
%# figure
figure, set(gcf, 'Color','white')
Z = peaks; surf(Z);  axis tight
set(gca, 'nextplot','replacechildren', 'Visible','off');

%# create AVI object
nFrames = 20;
vidObj = VideoWriter('myPeaks3.avi');
vidObj.Quality = 100;
vidObj.FrameRate = 10;
open(vidObj);

%# create movie
for k=1:nFrames
   surf(sin(2*pi*k/20)*Z, Z)
   writeVideo(vidObj, getframe(gca));
end
close(gcf)

%# save as AVI file, and open it using system video player
close(vidObj);
winopen('myPeaks3.avi')
IMWRITE

(технически не фильм, а анимированное GIF-изображение)

%# figure
figure, set(gcf, 'Color','white')
Z = peaks; surf(Z);  axis tight
set(gca, 'nextplot','replacechildren', 'Visible','off');

%# preallocate
nFrames = 20;
f = getframe(gca);
[f,map] = rgb2ind(f.cdata, 256, 'nodither');
mov = repmat(f, [1 1 1 nFrames]);

%# create movie
for k=1:nFrames
    surf(sin(2*pi*k/20)*Z, Z)
    f = getframe(gca);
    mov(:,:,1,k) = rgb2ind(f.cdata, map, 'nodither');
end
close(gcf)

%# create GIF and open
imwrite(mov, map, 'myPeaks4.gif', 'DelayTime',0, 'LoopCount',inf)
winopen('myPeaks4.gif')
 29 апр. 2015 г., 00:17
Как вы можете заменитьsurf командовать вsurf(sin(...,Z) поimshow? Я не понимаю, почему вы не можете использоватьimshow внутри вашей петли, какimshow(signal(:,k,:)).
 29 апр. 2015 г., 00:30
@ Маси: Вы должны быть в состоянии сделать это, без проблем ... Может быть, бросить вdrawnow вызов внутри цикла, чтобы убедиться, что графический конвейер сброшен.
 beginh25 июн. 2012 г., 04:21
спасибо за хороший обзор! как насчет предотвращения появления всплывающих фигур? Основной подход с такой предварительной настройкой, как здесь: set (gcf, «Visible», «Off»); Кажется, здесь не тот случай. В то время как положить вокруг "фигура" или «AVI»; создание ничего не делает. В то время как в 'k' петля, приводит к миганию. Есть ли другой подход?
 25 июн. 2012 г., 07:29
@beginh: прочитайте это:Render MATLAB figure in memory
 29 апр. 2015 г., 09:14
@Amro Спасибо за ваш ответ! Что-то еще в Matlab, чего я не понимаю. Я сделал новый вопрос здесьstackoverflow.com/q/29936706/54964
QTWriter

QuickTime фильмы, мой собственный QTWriter доступен:http://horchler.github.io/QTWriter/, Он работает очень похоже на MatlabVideoWriter класс, но имеет как кодеки неподвижных изображений с потерями, так и без потерь (форматы сжатия), которые хорошо работают с типичными данными на графиках Matlab (т.е. без межкадрового сжатия). Примечательно, что он также поддерживаетalpha channel transparency («Фото PNG» кодека),looping (два вида) иcontinuously variable frame rates, QTWriter написан как отдельный файл класса Matlab и должен работать на всех платформах, но я не проверял его наWindows.

Вот некоторый пример кода, иллюстрирующий, как может быть сгенерирован простой зацикленный фильм QuickTime с переменной частотой кадров:

% Prepare new movie file using the default PNG compression
movObj = QTWriter('peaks.mov');

% Create an animation
hf = figure; Z = peaks; surfc(Z); frames = 100;
axis tight; set(hf,'DoubleBuffer','on');
set(gca,'nextplot','replacechildren');

% Animate plot and write movie
for k = 0:frames
    hs = surfc(sin(2*pi*k/frames)*Z,Z);
    set(hs,'FaceColor','interp','FaceLighting','phong');
    light('Position',[0 0 4]);

    movObj.FrameRate = k;            % Vary the frame-rate
    writeMovie(movObj,getframe(hf)); % Write each frame to the file
end

movObj.Loop = 'backandforth'; % Set palindromic looping flag
close(movObj);                % Finish writing movie and close file

Выходной фильм, еще одна более сложная демонстрация, и дальнейшие деталидоступно на сайте проекта, QTWriter с открытым исходным кодом (Лицензия BSD) и хранилище кодаразмещено на GitHub.

 06 сент. 2013 г., 01:58
относительноgetframeЯ работал над альтернативой / заменой для него, используяhardcopy, но у меня были проблемы с сопоставлением пикселей в соотношении один к одному в хитрых случаях, когда захватывается только ось (я хочу идентичный вывод). И дажеhardcopy has issues и я думаю, что могут быть проблемы с различными рендерами и сopengl software Режим.
 23 авг. 2013 г., 03:49
+1 хороший проект! Спасибо, что поделились. Вы должны упомянуть тот факт, что вы не используете какой-либо внешний кодек или библиотеку, а пишете непосредственно в формате QuickTime.
 23 авг. 2013 г., 17:13
@Amro: Я не могу ничего протестировать или исправить в Windows, поэтому, если это не что-то кроссплатформенное, мне нужен конкретный отчет об ошибке. Работает ли более простая демоверсия? Это также может быть проблемой версии - когда я получу шанс, я проверю, чтобы убедиться, что все работает на R2013a.
 23 авг. 2013 г., 03:58
Кстати, демонстрация маятника не сохраняет видео правильно (проверено на Windows 8). Возможно, я сообщу об ошибке, как только посмотрю поближе.
 06 сент. 2013 г., 01:38
Поэтому я снова столкнулся с этой проблемой, создав собственную анимацию в формате GIF, и на этот раз я нашел ее. Оказывается, что "opengl renderer" в комбинации сgetframe внутри цикла проблема. Я исправил это, временно переключившись наopengl software Режим. Конечно, если вам это конкретно не нужно (например, если вы не используете прозрачность), просто измените его на один из других средств визуализации, таких какzbuffer который работает отлично. fwiw У меня не было этой проблемы на моей старой машине WinXP, также работающей под R2013a, это должна быть проблема Win7 / 8 ... Извините, я так долго возвращался к вам :)

http://www.mathworks.de/help/techdoc/ref/videowriterclass.html

Мой подход состоит в том, чтобы распечатать отдельные кадры / рисунки в файлы png, используяprint функция, дающая им имена файлов, такие как1.png, 2.png, ... а затем я использую бесплатный конвертер FFMPEG, чтобы сделать видео.

ffmpeg -r 20 -i %d.png foo.avi

Это позволяет много настраивать, когда дело доходит до параметров преобразования (битрейт, кодек, геометрия и т. Д.).

Команда для воспроизведения фильмов. Мне довольно легко работать. Я использовал его на графиках, чтобы показать изменения во времени, а также на отдельных изображениях, чтобы сделать настоящий фильм.

http://www.mathworks.com/help/techdoc/ref/movie.html

Я считаю, что общая процедура:

for ii=1:100
   plot(something(ii))
   F = getframe;
end
movie(F)

Чтобы сохранить фильм, вы можете использовать процедуру, аналогичную описанной выше, но используйте

writeVideo

команда.

http://www.mathworks.com/help/techdoc/ref/videowriterclass.html

Ваш ответ на вопрос