在 Matlab 中创建视频的可能性有哪些?我正在搜索并发现主要在该领域工作的 3 个工具箱,图像处理、图像采集和控制视觉......但是没有它们我怎么能做到,只是从头开始创建视频?我对各种概述的方法很感兴趣,但我无法在互联网上找到任何体面的教程或一致的信息来源。
谢谢您的帮助!
以下是在(核心)MATLAB 中创建电影的一些不同方法。
(已弃用,请改用 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')
(已弃用,请改用 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')
%# 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')
(技术上不是电影,而是动画 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
print
我的方法是使用为它们提供文件名的函数将单个帧/图形打印到 png 文件1.png, 2.png, ...
,然后我使用免费的 FFMPEG 转换器制作视频。
ffmpeg -r 20 -i %d.png foo.avi
当涉及到转换参数(比特率、编解码器、几何等)时,这允许进行大量微调。
Matlab 有一个内置的“电影”命令来播放电影。我发现它很容易使用。我已经在情节上使用它来显示时间的变化,以及制作真实电影的单个图像。
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
要导出QuickTime电影,可以使用我自己的 QTWriter:http: //horchler.github.io/QTWriter/。它的工作方式与 Matlab 的类非常相似VideoWriter
,但同时具有有损和无损静态图像编解码器(压缩格式),可以很好地处理 Matlab 图中的典型数据(即无帧间压缩)。值得注意的是,它还支持alpha 通道透明度('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 上。