在matlab中创建视频的方法

Posted

技术标签:

【中文标题】在matlab中创建视频的方法【英文标题】:Approaches to create a video in matlab 【发布时间】:2012-06-18 13:27:54 【问题描述】:

在 Matlab 中创建视频的可能性有哪些?我正在搜索并发现主要在该领域工作的 3 个工具箱,图像处理、图像采集和控制视觉......但是没有它们我怎么能做到,只是从头开始创建视频?我对各种概述的方法很感兴趣,但我无法在互联网上找到任何体面的教程或一致的信息来源。

感谢您的帮助!

【问题讨论】:

【参考方案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')

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

【讨论】:

感谢您的精彩概述!如何防止创建的数字弹出?主流的做法是这样预设的:set(gcf,'Visible','off');似乎不是这里的情况。虽然围绕“人物”或“AVI”创作,但什么都不做。在“k”循环中时,会导致闪烁。还有其他方法吗? @beginh:阅读:Render MATLAB figure in memory 如何将surf(sin(...,Z) 中的surf 命令替换为imshow?我不明白为什么你不能在你的 for 循环中使用imshow,比如imshow(signal(:,k,:)) @Masi:你应该可以做到,没问题......也许在循环内抛出一个drawnow调用以确保图形管道被刷新。 @Amro 谢谢你的回答! Matlab中的其他东西我不明白。我在这里提出了一个新问题***.com/q/29936706/54964【参考方案2】:

QTWriter

要导出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

输出影片、另一个更复杂的演示以及更多详细信息是available on the project website。 QTWriter 是开源的(BSD license),代码库是hosted on GitHub。

【讨论】:

+1 好项目!谢谢你的分享。您应该提到您没有使用任何外部编解码器或库,而是直接编写 QuickTime 格式。 顺便说一句,摆锤演示没有正确保存视频(在 Windows 8 上测试)。也许我会在仔细查看后提交一个错误.. @Amro:我无法在 Windows 上测试或修复任何东西,所以除非它是跨平台的,否则我需要一份特定的错误报告。更简单的演示有效吗?这也可能是一个版本问题——当我有机会时,我会检查一下,看看所有这些在 R2013a 上是否仍然有效。 于是我又遇到了这个问题,制作自己的GIF动画,这次我追查到了这个问题。事实证明,“opengl 渲染器”与循环内的getframe 结合使用是问题所在。我通过暂时切换到opengl software 模式来修复它。当然,如果您不需要特别需要它(例如,如果您不使用透明度),只需将其更改为其他渲染器之一,例如 zbuffer 即可完美运行。 fwiw 我在运行 R2013a 的旧 WinXP 机器上没有这个问题,它一定是 Win7/8 问题......对不起,我花了这么长时间才回复你:) 关于getframe,我已经使用hardcopy 对其进行了替代/替换工作,但是在仅抓取一个轴的棘手情况下,我无法将像素一对一匹配(我想要相同的输出)。甚至hardcopy has issues 我想不同的渲染器和opengl software 模式可能存在问题。【参考方案3】:

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

【讨论】:

【参考方案4】:

有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中创建视频的方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在matlab中创建m文件

从 std::vector 在 MEX C++ 中创建 MATLAB 数组

是否可以在 Iphone 中创建视频警报? [关闭]

在 MATLAB 中创建电影文件的问题

在 Matlab 中创建具有行和列名的空表

如何使用 MAC OS MATLAB 读取在 windows MATLAB 中创建的 .mat 文件