video_info=aviinfo([pathname filename]);
% info =
% Filename: 视频名称
% FileSize: 视频大小
% FileModDate: 视频创建日期
% NumFrames: 视频总帧数
% FramesPerSecond: 视频采集速率
% Width: 视频宽度
% Height: 视频高度
% ImageType: 'truecolor' 图像模式
% VideoCompression: 'DIV3' 视频图像压缩格式
% Quality: 0
% NumColormapEntries: 0
LEN=video_info.NumFrames; %获得视频长度
for k=1:LEN
video_videotape(k)=aviread(video_info.Filename,k);
video_image=video_videotape(k).cdata;
if k<10
把每帧图像存入硬盘
elseif k>=10 & k<100
把每帧图像存入硬盘
elseif k>=100 & k<1000
把每帧图像存入硬盘
elseif k>=1000 & k<1000
把每帧图像存入硬盘
else
把每帧图像存入硬盘
end
end
备注:通过更改imwrite那儿的很多参数,可以获得自己想要的很多结果,比如更改bmp为jpg,以及其它,具体请在MATLAB下help imwrite。
最近也碰到了这样得问题,试试这个:
clc
clear all
mov=mmreader('XX.avi'); %用mmreader读入视频文件
for i=1:mov.numberofframes %获得总帧数,并依次读取
b=read(mov,i)
把第i帧的图片写为
end
如果还无法读取,需要使用aviinfo,查看解码类型,再网上下载相应的解码器,然后安装。
谢谢!
在论坛里学习了很多天,终于总结出一个方法,如下:(在matlab R2008a环境下)
mov=mmreader('era.avi'); %用mmreader读入视频文件
for i=1:mov.numberofframes %获得总帧数,并依次读取
b=read(mov,i)
把第i帧的图片写为
end
这样,就可以对视频进行逐帧处理了。比如,
读出第三帧的图片
imshow(a)
function frame2bmp(video,s,e,t,pickind)
y=e-s+1;
for n=1:t:y
a=video.frames(n).cdata;
strtemp=strcat('g:\转换的图片\\',int2str(n),'.',pickind);
imwrite(a,strtemp);
end
这是一个用matlab将视频的每一帧转化为bmp格式的图像保存起来的程序~~不是我写的,所以看不懂。尤其是那个pickind参数,究竟代表什么?
提问者: st1121 - 五级
最佳答案
哈哈,这个程序我用过。
根据lz的程序理解,
video是你电影读取到matlab中的程序,应该在主程序中有video=aviread('你电影的路径');这么一段吧?
s是你想截取图像的第一帧,e是你想截取图像的最后一帧,t是每隔多少帧你想截取一个图像,y是总共要截取的图像数目。a是图像的信息,你可以打开a看看,都是数字。pickind是截取的图像的后缀,如果你想要jpg,那就是pickind='jpg'; strtemp是图像保存的路径和文件名。imwrite是将刚才读出的图像信息保存到你所在的图像路径中去。
如果有不懂站内信哈。
但是lz的程序比较费内存,因为video需要将电影文件一下子全部读到matlab里面去,会很慢。
另外我给这个程序改了一下,avi_file是电影文件的路径,pic_file是存放图片的路径和文件名。
function avi2pic5(avi_file,pic_file)
movinfo=aviinfo(avi_file);
frame_num=movinfo.NumFrames;
frame_rate=movinfo.FramesPerSecond;
pic_kind='bmp';
i=1;
for n=1:frame_rate:frame_num
mov=mmread(avi_file,n);
pic_name=sprintf('%.4d',i);
strtemp=strcat(pic_file,'_',pic_name,'.',pic_kind);
imwrite(mov.frames.cdata(:,:,:),strtemp);
i=i+1;
end