MATLAB二维图动画视频制作

MATLAB二维图动画视频制作

读取或写入视频

读取视频数据
VideoReader 读取视频文件
readFrame 从视频文件中读取视频帧
hasFrame 确定帧是否可供读取
getFileFormats VideoReader 支持的文件格式
mmfileinfo 有关多媒体文件的信息
写入视频数据
VideoWriter 写入视频文件
open 打开文件以写入视频数据
writeVideo 将视频数据写入到文件
close 写入视频数据之后关闭文件
getProfiles VideoWriter 支持的描述文件和文件格式
VideoWriter函数说明

VideoWriter 对象根据数组或影片创建一个视频文件。该对象包含有关视频的信息以及控制输出视频的属性。您可以使用 VideoWriter 函数创建 VideoWriter 对象,指定其属性,然后使用对象函数写入视频。

创建对象
v = VideoWriter(filename)
v = VideoWriter(filename,profile) %filename - 文件名,profile - 文件类型
  • v = VideoWriter(filename) 创建一个 VideoWriter 对象以将视频数据写入采用 Motion JPEG 压缩技术的 AVI 文件。
  • v = VideoWriter(filename,profile) 还应用一组适合特定文件格式(例如 'MPEG-4''Uncompressed AVI')的属性。

VideoWriter 支持以下文件扩展名。

.avi AVI 文件
.mj2 Motion JPEG 2000 文件
.mp4.m4v MPEG-4 文件

如果未指定有效的文件扩展名,VideoWriter 将追加扩展名 .avi.mj2.mp4,具体取决于profile 参数的值。如果未指定 profile 的值,则 VideoWriter 将创建一个 Motion JPEG 压缩的 AVI 文件并且扩展名为 .avi

文件类型,指定为下列值之一。

profile 的值 说明
'Archival' 采用无损压缩的 Motion JPEG 2000 文件
'Motion JPEG AVI' 使用 Motion JPEG 编码的 AVI 文件
'Motion JPEG 2000' Motion JPEG 2000 文件
'MPEG-4' 使用 H.264 编码的 MPEG-4 文件(Windows 7或更高版本或者 macOS 10.7 及更高版本的系统)
'Uncompressed AVI' 包含 RGB24 视频的未压缩 AVI 文件
'Indexed AVI' 包含索引视频的未压缩 AVI 文件
'Grayscale AVI' 包含灰度视频的未压缩 AVI 文件

profile 设置视频属性(例如 VideoCompressionMethod)的默认值。

视频播放的速率

视频的播放速率(每秒帧数),指定为正数。

对象函数
open 打开文件以写入视频数据
close 写入视频数据之后关闭文件
writeVideo 将视频数据写入到文件
VideoWriter.getProfiles VideoWriter 支持的描述文件和文件格式
从动画创建 AVI 文件

按以下步骤将一组帧写入压缩的 AVI 文件:生成一组帧,为要写入的文件创建视频对象,然后将帧写入视频文件。

Z = peaks;
surf(Z); 
axis tight manual 
set(gca,'nextplot','replacechildren'); %设置坐标区和图窗属性,以生成视频帧。
v = VideoWriter('peaks.avi');%为输出视频文件创建 VideoWriter 对象并打开该对象以进行写入。
% 设置帧数
v.FrameRate = fps; 
open(v);
for k = 1:200 %生成一组帧,从图窗中获取帧,然后将每一帧写入文件。
   surf(sin(2*pi*k/200)*Z,Z)
   frame = getframe(gcf);% 获取figure窗口
   writeVideo(v,frame);%将每一帧写入文件。
end
close(v);

读取写入动图

imwrite将图像写入图形文件

imwrite语法
imwrite(A,filename)
imwrite(A,map,filename)
说明

imwrite(A,filename) 将图像数据 A 写入 filename 指定的文件,并从扩展名推断出文件格式。imwrite 在当前文件夹中创建新文件。输出图像的位深度取决于 A 的数据类型和文件格式。对于大多数格式来说:

  • 如果 A 属于数据类型 uint8,则 imwrite 输出 8 位值。
  • 如果 A 属于数据类型 uint16 且输出文件格式支持 16 位数据(JPEG、PNG 和 TIFF),则 imwrite 将输出 16 位的值。如果输出文件格式不支持 16 位数据,则 imwrite 返回错误。
  • 如果 A 是灰度图像或者属于数据类型 doublesingle 的 RGB 彩色图像,则 imwrite 假设动态范围是 [0,1],并在将其作为 8 位值写入文件之前自动按 255 缩放数据。
  • 如果 A 中的数据是single,则在将其写入 GIF 或 TIFF 文件之前将 A 转换为 double
  • 如果 A 属于 logical 数据类型,则 imwrite 会假定数据为二值图像并将数据写入位深度为 1 的文件(如果格式允许)。BMP、PNG 或 TIFF 格式以输入数组形式接受二值图像。
  • 如果 A 包含索引图像数据,则应另外指定 map 输入参数。

imwrite(A,map,filename)A 中的索引图像及其关联的颜色图写入由 map filename 指定的文件。

  • 如果 A 是属于数据类型 doublesingle 的索引图片,则 imwrite 通过从每个元素中减去 1 来将索引转换为从 0 开始的索引,然后以 uint8 形式写入数据。如果 A 中的数据是 single,则在将其写入 GIF 或 TIFF 文件之前将 A 转换为 double
写入 GIF 动画

绘制一系列图、将它们捕获为图像,然后写入 GIF 动画文件。

绘制 y = x n y=x^n y=xn,其中 n = 3 n=3 n=3

x = 0:0.01:1;
n = 3;
y = x.^n;
plot(x,y,'LineWidth',3)
title(['y = x^n,  n = ' num2str(n) ])

MATLAB二维图动画视频制作_第1张图片

捕获 n n n 值递增时的一系列绘图。

n = 1:0.5:5;
nImages = length(n);

fig = figure;
for idx = 1:nImages
    y = x.^n(idx);
    plot(x,y,'LineWidth',3)
    title(['y = x^n,  n = ' num2str( n(idx)) ])
    drawnow
    frame = getframe(fig);% 获取figure窗口
    im{idx} = frame2im(frame);% 转为彩色图像
end
close;

将多个系列的图像显示在一个图窗中。

figure;
for idx = 1:nImages
    subplot(3,3,idx)
    imshow(im{idx});
end

MATLAB二维图动画视频制作_第2张图片

将九个图像保存到一个 GIF 文件中。因为 GIF 文件不支持三维数据,所以应调用 rgb2ind,使用颜色图 map 将图像中的 RGB 数据转换为索引图像 A。要将多个图像添加到第一个图像中,请使用名称-值对组参数 'WriteMode','append' 调用 imwrite

filename = 'testAnimated.gif'; % Specify the output file name
for idx = 1:nImages
    [A,map] = rgb2ind(im{idx},256);
    if idx == 1
        imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',1);
    else
        imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',1);
    end
end

imwrite 将 GIF 文件写入您的当前文件夹。名称-值对组 'LoopCount',Inf 使动画连续循环。'DelayTime',1 在每个动画图像显示之间指定了一秒的时滞。

注意:imwrite写GIF的时候,只支持uint8类型的单通道数据,若为彩色图则需要如下操作

% 将彩色图转为索引图
[I,map] = rgb2ind(RGB,128);

情况一:对数据进行操作

我们先生成一个测试数据(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
    %%名称-值对组 'LoopCount',Inf 使动画连续循环。'DelayTime',1 在每个动画图像显示之间指定了一秒的时滞。'WriteMode':'append'追加模式
    
  • 写为视频

    fps = 32;
    myVideo = VideoWriter('test1.avi'); 
    myVideo.FrameRate = fps; %确定帧速率32
    open(myVideo);%打开视频
    for k = 1:256
        writeVideo(myVideo,data(:,:,k)); %将视频数据写入到文件
    end
    close(myVideo); 
    

情况二:对界面进行操作

  • 写为动图

    clear;close all;clc;
    j=1;
    Z = peaks;
    surf(Z)
    axis tight
    Zl=zlim;
    for k = 1:20
        surf(cos(2*pi*k/20)*Z,Z)
        zlim(Zl);
        % save to gif
        f = getframe  % 获取figure窗口
        data=frame2im(f);  % 转为彩色图像
        [I,map] = rgb2ind(data,256);  % 将彩色图转为索引图
        if k==1
            imwrite(I,map,'example.gif','gif','loopcount',inf,'Delaytime',0.2)
        else
            imwrite(I,map,'example.gif','gif','writemode','append','Delaytime',0.2)
        end
    end
    %%名称-值对组 'LoopCount',Inf 使动画连续循环。'DelayTime',1 在每个动画图像显示之间指定了一秒的时滞。'WriteMode':'append'追加模式
    

  • 写为视频

    clear;close all;clc;
    fps = 10;
    myVideo = VideoWriter('media.avi'); 
    myVideo.FrameRate = fps; 
    open(myVideo); 
    for j=1:100
        set(gcf,'color','none');%设置背景色为无色
        axis([-1,1,-1,1])%设置坐标轴范围
        set(gca,'nextplot','replacechildren','box','off','color','k','xgrid','on') %设置坐标轴
        Z=fft(eye(j+1));
    	plot(Z),hold on 
        pause(0.4)
        axis([-1,1,-1,1]),drawnow
        frame = getframe(gca);
        im = frame2im(frame); 
        writeVideo(myVideo,im); 
    end 
    close(myVideo); 
    close all
    
    

MATLAB二维图动画视频制作_第3张图片

你可能感兴趣的:(matlab)