Подходы для создания видео в Matlab
Каковы возможности для создания видео в Matlab? Я искал и нашел в основном 3 набора инструментов, которые работают в этой области: обработка изображений, получение изображений и контроль зрения... но как я могу сделать это без них, просто чтобы создать видео с нуля? Мне интересны различные подходы, чтобы получить обзор, но я не смог найти ни одного достойного учебника или постоянного источника информации в Интернете.
Спасибо за помощь!
4 ответа
Вот некоторые из различных способов создания фильмов в (основной) MATLAB.
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')
Есть http://www.mathworks.de/help/techdoc/ref/videowriterclass.html
Мой подход заключается в печати отдельных кадров / рисунков в png-файлах print
функция, дающая им имена файлов, такие как 1.png, 2.png, ...
а затем я использую бесплатный конвертер FFMPEG, чтобы сделать видео.
ffmpeg -r 20 -i %d.png foo.avi
Это позволяет много настраивать, когда дело доходит до параметров преобразования (битрейт, кодек, геометрия и т. Д.).
Matlab имеет встроенную команду 'movie' для воспроизведения фильмов. Мне довольно легко работать с Я использовал его на графиках, чтобы показать изменения во времени, а также на отдельных изображениях, чтобы сделать настоящий фильм.
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
QTWriter
Для экспорта фильмов в формате QuickTime доступен мой собственный QTWriter: http://horchler.github.io/QTWriter/. Это работает очень похоже на Matlab's VideoWriter
класс, но имеет как кодеки неподвижных изображений с потерями, так и без потерь (форматы сжатия), которые хорошо работают с типичными данными на графиках Matlab (т.е. без межкадрового сжатия). Примечательно, что он также поддерживает прозрачность альфа-канала (кодек "Photo PNG"), циклы (два вида) и бесступенчатую частоту кадров. 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.