在CSDN发现一个类似的居然要VIP才能查看,顿时有点无语,所以自己做了一个。
如题,MATLAB制作动图或视频。主要讲解两种不同的场合:
1)有准备好的图像数据,将其制作成动图或视频;
2)把MATLAB plot或imshow的结果保存为动图或视频
% 创建并写入第一帧
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);
% 创建一个AVI视频文件
myVideo = VideoWriter(myVideo.avi');
% 打开文件
open(myVideo);
% 写入视频帧
writeVideo(myVideo,frame); % frame可以是灰度图或彩色图
% 关闭文件
close(myVideo);
最常用参数
% 设置帧数
myVideo.FrameRate = fps;
想设置其他参数可查看帮助文件, help VideoWriter
% 获取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
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
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;
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
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。