1.如何从视频流中提取图像
2008以前的版本中提供了aviread这个方法用于读取avi文件,但由于该接口要求avi文件是没有压缩的,这导致其应用非常受限,经过从网上大量的资料搜索,发现了mmreader这个接口,它可以读多种类型的文件,如avi,rmvb,wmv等;同时matlab中提供的aviinfo函数,可以获得avi文件的一些信息,如帧长,时长,帧率,大小等;
下面的程序演示了将视频转换成图片并保存的示例:
fileName='vedio.avi';
videoInfo=aviinfo(fileName);
%videoInfo.FramesPerSecond; %帧率
%videoInfo.NumFrames;%帧数
for i=1:videoInfo.FramesPerSecond:videoInfo.NumFrames
temp=mmreader(fileName,i); %获得图片对象
t=temp.frames.cdata(:,:,:); %转化成图片
strtemp=strcat('D:\work\picture\',int2str(i),'.','bmp');
imwrite(t,strtemp);
end
获取图片的方法中,采用了两个参数的形式,每次读取一帧到内存,这样是防止视频过大导致内存溢出。
2. 将图片成avi文件
pfrom=1;pto=200; pext='.bmp';
navi='tt.avi'; %构造avi文件
aviobj = avifile(navi);
aviobj.Quality = 100;
aviobj.compression='None';
for i=pfrom:pto
fname=strcat('picture\',num2str(i),pext);
adata=imread(fname);
aviobj = addframe(aviobj,uint8(adata)); %向avi文件中加帧,转成8位的格式
end
aviobj=close(aviobj);