【问题标题】:MATLAB Create MovieMATLAB 创建电影
【发布时间】:2013-07-01 16:55:32
【问题描述】:

** 我想出了如何创建电影,因此代码已被更改以反映正确的代码,以防将来对任何人有用。 此脚本创建 eqdconic 地图的电影并将其保存为 avi 格式。影片将运行 1255 帧。它还在图像上的某个点绘制一个点,在电影上放置一个变化的标题以显示正在运行的月份,并在右侧有一个颜色条。

使用的一些变量是在其他地方创建的。创建它们的代码已被省略以压缩代码(因为它们对我以外的任何人都没有用处)。

% Create movie
    nFrames = 34; % Number of frames

for k = 1:nFrames
    % Eqdconic script    
    % Define figure and axes
    fg1 = figure(1);
    axesm('MapProjection','eqdconic', 'MapParallels', [], 'MapLatLimit',[-80 -59],'MapLonLimit',[190 251]) % 60-70S and 120-160W
    framem on; gridm on; mlabel on; plabel on; hold all;

    % Plot data
    frame = dataPoint_movie(:,:,k);
    image = contourfm(lat,lon,frame, 'LineStyle', 'none');

    hold on

    % Plot dot    
    plotm(-66.75,224,'k.','MarkerSize',30); 

    % Colorbar
    caxis([0 100]); 
    h = colorbar;
    ylabel(h,'Percent');

    % Title: Days 1:1258 inclusive. 20100101 to 20130611
    date = datenum(2009, 12, 31) + k; % Convert t into serial numbers
    str = datestr(date, 'mmm yyyy'); % Show in the format mmm yyyy so title changes only once a month
    title(str);

    mov(k) = getframe(gcf); % gca would give only the image. gcf places the title and other attributes on the movie.
end

close(gcf)

% % Save as AVI file 
movie2avi(mov, 'SeaIceConcentration.avi', 'compression', 'none', 'fps', 2); 

【问题讨论】:

  • for t = 1:12-loop 是生成图还是只是空轴?
  • 基于getframe-documentation,你试过A(i)而不是A(:,:,i)吗?
  • 你为什么从i=1:numframes循环,然后又从t=1:1258循环每个i
  • 刚试过A(i)。还是一片空白。我一次测试了 1 张图像的 contourfm 绘图部分,并且有效。所以我认为是电影不行。
  • 为什么需要t-loop?如果我理解正确,您的numframes 等于天数。

标签: matlab movie


【解决方案1】:

我更喜欢将我的电影从 matlab 导出为 .avi 文件。

在 for 循环之前,初始化您的电影:

vidObj = VideoWriter('Movie.avi');
vidObj.FrameRate=23;
open(vidObj);

然后让你的框架进入 for 循环:

A = getframe;
writeVideo(vidObj,A);

(注意,我没有将每一帧保存在矩阵中,所以 A 是一个 MxN 矩阵)

然后在 for 循环之后写出你的电影

 close(vidObj);

电影将在您当前的工作目录中。您可以使用 quicktime 或其他一些 avi 播放器打开。要更改电影的帧速率(速度),请编辑第二行代码。 23 fps 是一个很好的平滑电影帧率。

【讨论】:

  • 我并不是要刻薄,但这些确实是单独的问题,这些论坛的目的不是调试您的特定代码。对于日期,请尝试查看this post。对于图形调整大小,您可以使用 set 命令执行此操作,如 illustrated here
【解决方案2】:

检查语句的一致性:

A = dataPoint(:,:,t);

A(i) = getframe;

A 一直被覆盖,这样你最多只能得到最后一帧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 2015-08-08
    • 1970-01-01
    • 2013-06-21
    相关资源
    最近更新 更多