Matlab—将绘图保存为视频


转载请注明:iracer的CSDN博客 http://blog.csdn.net/iracer/article/details/48876473

Matlab—绘图保存为视频VideoWrite()函数用法与自定义视频尺寸

 

 

1.早期版本的avifile()函数

 

Matlab中提供了将显示图形保存成视频的功能。早期的版本使用函数avifile()来创建视频文件用于存储动画

 

vedioObj = avifile(filename,'PropertyName',value,'PropertyName',value,...); %// 创建视频文件


avifile()函数的使用方法和例子可以参看

 

http://www-rohan.sdsu.edu/doc/matlab/techdoc/ref/avifile.html

http://www.cnblogs.com/wb-DarkHorse/p/3171418.html

2.VideoWrite()函数

在使用Matlab2012时,发现avifile()已经被新的类VideoWriter()取代。

VideoWrite函数,配合open,writeVideo和close方法从图像(figure)中创建视频文件、静态图像或Matlab视频。VideoWrite函数可以创建AVI和Motion JPEG 2000格式的视频文件,这些文件在多平台上都能播放,也可以创建在window平台上播放的MPEG-4文件。VideoWrite函数支持大于2GB的视频文件。VideoWrite函数使用预先定义的属性来设置视频属性,例如'Uncompressed AVI' or 'MPEG-4'等。创建视频文件:

 

writerObj = VideoWriter(filename,profile) 

 

VideoWrite函数有两个输入参数:filename和profile。

 

(1)VideoWrite()函数参数:filename

单引号引用的字符串指定视频文件名。文件名可以加扩展名,也可以不加扩展名。Matlab支持的视频文件扩展名如下表所示:

 

如果文件名不指定扩展名,VideoWrite函数将根据profile的设置来自动加上.avi,.mj2,.mp4 或者.m4v的扩展名,如果没有设置profile的值,VideoWrite函数默认保存为.avi文件。

 

(2)VideoWrite()函数参数:profile

 

使用单引号引用的字符串,描述了创建视频的类型。

 

profile的缺省值为'Motion JPEG AVI'。

(3)VideoWrite()函数:操作方法

VideoWrite函数还有许多操作方法帮助我们完成写视频和获取视频属性的工作,例如:

close               Closefile after writing video data 写完视频数据后关闭文件

getProfiles     List profiles and file formats supportedby VideoWriter 列出VideoWriter支持的配置和文件格式

open               Openfile for writing video data 打开视频

writeVideo     Write video data to file 写视频

3.写视频的步骤

 

写视频的步骤主要包括

 

 

  • 创建视频并打开该视频文件
  • 在循环中获取图像中的帧
  • 将帧写入视频文件
  • 循环结束后关闭视频文件

 

以下举上一篇博文绘制半径逐渐变化的圆及扫描线段的例子说明将绘图保存成视频的方法。

(1)创建并打开视频文件

在代码初始化阶段创建一个视频文件,指定其名称,并打开该视频文件。

 

 
  1. writerObj=VideoWriter('test.avi'); %// 定义一个视频文件用来存动画

  2. open(writerObj); %// 打开该视频文件

 

 

(2)在循环中获取图像帧并写入视频

 

写入视频的前提是不断获取图像帧,而这一步骤则是每次更新figure上的图形后来完成,即在绘图循环中,所有图形重绘结束后,使用getframe方法获取当前figure上的图像并写入打开的视频文件

 

 
  1. frame = getframe; %// 把图像存入视频文件中

  2. writeVideo(writerObj,frame); %// 将帧写入视频

 

 

(3)循环结束后关闭视频文件句柄

循环结束后(想要记录的图像全部绘制完毕后),别忘了关闭视频文件句柄

 

 

close(writerObj); %// 关闭视频文件句柄

 

 

创建到工作目录下的测试视频文件

4.自定义视频的像素尺寸

VideoWrite()函数默认根据第一帧的大小决定保存视频高和宽,并且没有给出自定义视频尺寸的方法。网上搜了很久,没有找到如何改变保存视频像素尺寸的方法。设置断点调试,发现frame=getframe;获取的帧frame为一个结构体,包含两个成员:

frame的结构

cdata为数据,colormap为调色板。cdata的尺寸378×607就是第一帧读取的图像的尺寸,VideoWrite()函数将默认以该尺寸保存所有图像帧到视频文件。

有时,图像绘制过程中,如果曲线的尺寸会随时间变化:变小不会有问题,而如果曲线尺寸超过378×607就会出错。为了避免因此造成的错误,可以通过在读完每一帧后改变该帧的尺寸,来实现将视频保存成自定义的长宽,不足的部分自动用figure的底色填充。

 
  1. frame = getframe;

  2. frame.cdata = imresize(frame.cdata, [H W]); %// 设置视频宽高:H为行数(高),W为列数(宽writeVideo(writerObj,frame);

 

 

 

 

2.

matlab读写视频VideoReader/VideoWriter

前言

视频处理分析的过程中,需要用到将视频一帧帧地读取、写入,本文就涉及此问题。

系统环境

1.系统:win7_64

2.matlab版本:matlab2015a

测试代码

代码一(读视频):

复制代码

%To read video frames.
clc
clear 
close all

fileName = 'E:\fatigue_detection\dataset\segVideosP1\1_5.avi';  
obj = VideoReader(fileName); 
numFrames = obj.NumberOfFrames;                       
for i = 1 : numFrames      
    frame = read(obj,i);                                 
    imshow(frame);                                        
    imwrite(frame,strcat(num2str(i),'.jpg'),'jpg');  
end

复制代码

 代码二(读视频):

 

复制代码

fileName = 'E:\fatigue_detection\dataset\segVideosP1\1_5.avi';  

xyloObj = VideoReader(fileName);

vidWidth = xyloObj.Width;
vidHeight = xyloObj.Height;
% mov = struct('cdata',zeros(vidHeight,vidWidth,3,'uint8'),'colormap',[]);

while hasFrame(xyloObj)
    frame = readFrame(xyloObj);
    imshow(frame);
end

复制代码

 

代码三(写视频):

写视频步骤:

创建视频文件VideoWriter - > 打开视频文件open - > 获取视频帧并写入视频文件writeVideo -> 关闭视频文件close.

复制代码

fileName = 'E:\fatigue_detection\dataset\segVideosP1\1_5.avi';  

%method2
xyloObj = VideoReader(fileName);
vidWidth = xyloObj.Width;
vidHeight = xyloObj.Height;
fps = xyloObj.FrameRate;

out = VideoWriter('out.avi');
out.FrameRate = fps;
open(out);
while hasFrame(xyloObj)
    frame = readFrame(xyloObj);
    writeVideo(out, frame);
end
close(out);

复制代码

代码可参考matlab的help文档.

注意:

1.不同版本之间可能会存在一些代码问题,可参考help文档进行修正.

2.写入视频文件之前要先打开文件,写入完毕之后要关闭文件.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值