0

** 我想出了如何创建电影,因此代码已被更改以反映正确的代码,以防将来对任何人有用。此脚本创建 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); 
4

2 回答 2

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 是一个很好的平滑电影帧率。

于 2013-07-01T17:43:02.900 回答
1

检查语句的一致性:

A = dataPoint(:,:,t);

A(i) = getframe;

A 一直被覆盖所以你最多只能得到最后一帧。

于 2013-07-01T17:53:28.770 回答