MATLAB制作动图或视频


by HPC_ZY


在CSDN发现一个类似的居然要VIP才能查看,顿时有点无语,所以自己做了一个。
如题,MATLAB制作动图或视频。主要讲解两种不同的场合:
1)有准备好的图像数据,将其制作成动图或视频;
2)把MATLAB plot或imshow的结果保存为动图或视频


主要函数介绍

  1. 生成动图
% 创建并写入第一帧
imwrite(frame,'test.gif','LoopCount',Inf,'DelayTime',dt);
% 写入后续帧
imwrite(frame'test.gif','WriteMode','append','DelayTime',dt);

'LoopCount’为循环次数,Inf则无限循环;
'DelayTime’为时间间隔,如dt=0.05,则每秒显示20张。
想设置其他参数可查看帮助文件, help imwrite
注意:imwrite写GIF的时候,只支持uint8类型的单通道数据,若为彩色图则需要如下操作

% 将彩色图转为索引图
[I,map] = rgb2ind(RGB,128);
  1. 生成视频
% 创建一个AVI视频文件
myVideo = VideoWriter(myVideo.avi'); 
% 打开文件
open(myVideo);
% 写入视频帧
writeVideo(myVideo,frame);  % frame可以是灰度图或彩色图
% 关闭文件
close(myVideo); 

最常用参数

% 设置帧数
myVideo.FrameRate = fps; 

想设置其他参数可查看帮助文件, help VideoWriter

  1. 导出figure界面
% 获取figure窗口
frame = getframe(gcf);
% 转为彩色图像
im = frame2im(frame);

情况一:对数据进行操作

我们先生成一个测试数据(256张尺寸为256*256的渐变图)

data = zeros(256,256,256,'uint8'); % 注意:imwrite写GIF的时候,只支持uint8类型的数据
for k = 1:255
    data(:,k+1,k+1) = k;
    data(:,:,k+1) = data(:,:,k+1)+data(:,:,k);
end
  1. 写为动图
dt = 1/32;
imwrite(data(:,:,1),'test1.gif','LoopCount',Inf,'DelayTime',dt);
for k = 2:256
    imwrite(data(:,:,k),'test1.gif','WriteMode','append','DelayTime',dt);
end
  1. 写为视频
fps = 32;
myVideo = VideoWriter('test1.avi'); 
myVideo.FrameRate = fps; 
open(myVideo); % 打开
for k = 1:256
    writeVideo(myVideo,data(:,:,k)); 
end
close(myVideo); 

效果图
在这里插入图片描述


情况二:对界面进行操作

我们绘制一条曲线

x = 0:2*pi/199:2*pi;
y = x.*sin(x).^2;
  1. 写为动图
dt = 1/40;
figure
for k = 1:200
    plot(x(k),y(k),'r.'),hold on
    axis([0,2*pi,0,max(y)]),drawnow
    frame = getframe(gcf);
    im = frame2im(frame);
    [I,map] = rgb2ind(im,128);
    if k>1
        imwrite(I,map,'test2.gif','WriteMode','append','DelayTime',dt);
    else
        imwrite(I,map,'test2.gif','LoopCount',Inf,'DelayTime',dt);
    end
end
  1. 写为视频
fps = 40;
myVideo = VideoWriter('test2.avi'); 
myVideo.FrameRate = fps; 
open(myVideo); 
figure
for k = 1:200
    plot(x(k),y(k),'r.'),hold on
    axis([0,2*pi,0,max(y)]),drawnow
    frame = getframe(gcf);
    im = frame2im(frame); 
    writeVideo(myVideo,im); 
end
close(myVideo); 

效果图
在这里插入图片描述


其他

今天也是看到,对于这么简单的知识点,居然还有人设置为VIP可见。感觉为了利益真是不择手段/哭笑……有点感慨。当然,良心博主还是挺多的。

有任何问题欢迎讨论,最后还是把测试代码上传
https://download.csdn.net/download/xsz591541060/11447291
由于很简单,不推荐下载,除非你买了年VIP。

猜你喜欢

转载自blog.csdn.net/xsz591541060/article/details/97641058