暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Matlab-动图/视频制作

Matlab随笔 2021-08-25
1709

本篇文章讲述如何将多张图片转化为动图或视频。

一.图片转为GIF

效果图


一言以蔽之,对多张索引图像使用imwrite函数,即可得到GIF图像!

你需要解决两个问题:

①如何将RGB图像转化为索引图像 (答:用rgb2ind函数)

②如何使用imwrite函数(答:将多个图像添加到第一个图像中)


完整代码

    x = 0:0.01:1;
    n = 0:0.2:3;
    nImages = length(n);
    fig=figure;
    filename = 'test1.gif';


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


    frame = getframe(fig);% getframe:捕获坐标区或图窗作为影片帧
    im = frame2im(frame);% frame2im:从单个影片帧 F 返回真彩色 (RGB) 图像
    [A,map] = rgb2ind(im,256);% rgb2ind:将 RGB 图像转换为索引图像


    if idx == 1
    % LoopCount:重复动画次数
    % DelayTime=1:每个动画图像的时滞为一秒
    imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',1);
    else
    % WriteMode=append:将多个图像添加到第一个图像中
    imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',1);
    end
    end


    你可以通过help imwrite详细学习此内容!


    二.图片转为Video

    一言以蔽之,对多张RGB图像使用writeVideo函数,即可得到视频!

    你需要解决两个问题:

    ①使用writeVideo函数写视频之前需要做哪些准备

    (答:①创建VideoWriter对象 ②视频的属性设置 ③打开对象进行写入)

    ②writeVideo函数如何使用

    完整代码

      x = 0:0.01:1;
      n = 0:0.2:3;
      nImages = length(n);
      fig=figure;
      myVideo = VideoWriter('test1.avi');
      myVideo.FrameRate = 1; % 视频播放的速率
      open(myVideo); % 打开该对象以进行写入


      for idx = 1:nImages
      %% 1
      y = x.^n(idx);
      plot(x,y,'LineWidth',2)
      title(['y = x^n, n = ' num2str( n(idx)) ])
      %% 2
      frame = getframe(fig);
      writeVideo(myVideo,frame);
      end
      close(myVideo);

      你可以通过help writeVideo详细学习此内容!


      三.Video转为GIF

      一言以蔽之,获取视频中每一帧图片及视频速率,用imwrite写为动图

      你需要解决以下3个问题

      ①如何获取每一帧图片(答:frame=read(V,i);)

      ②如何获取视频速率(答:Framerate=V.FrameRate; )

      ③imwrite如何使用


      完整代码

        [filename1, pathname1] = uigetfile({'*.mp4';'*.avi';'*.*'});
        V=VideoReader([pathname1,filename1]);
        filename='test2.gif';
        numFrames = V.NumFrames; % 获取视频帧的总数
        Framerate=V.FrameRate; % 获取视频帧率
        for i=1:numFrames
        frame=read(V,i);
        [A,map]=rgb2ind(frame,256);
        if i == 1
        imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',1/Framerate);
        else
        imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',1/Framerate);
        end
        end



        参考:https://blog.csdn.net/qq_44770178/article/details/111836956


        希望大家多多点赞、在看、分享”~~

        点个在看你最好看

        文章转载自Matlab随笔,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论