Подтвердить что ты не робот

Подходы к созданию видео в Matlab

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

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

4b9b3361

Ответ 1

Вот некоторые из различных способов создания фильмов в (основной) MATLAB.

MOVIE2AVI

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

%# 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')

Ответ 2

Существует http://www.mathworks.de/help/techdoc/ref/videowriterclass.html

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

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

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

Ответ 3

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

Ответ 4

QTWriter

Чтобы экспортировать QuickTime фильмы, мой собственный QTWriter доступен: http://horchler.github.io/QTWriter/. Он очень похож на класс Matlab 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.