MATLAB实现视频关键帧提取

求具体操作方法!!如何将视频转换为图片,然后对图片进行关键帧提取,用MATLAB实现。
十分感谢!!

%该代码用于将视频文件的每一帧变成一幅图片
[filename,pathname,fileindex]=uigetfile('*.avi','选择视频文件','选择视频文件.avi','Multiselect','on');
% [FileName,PathName,FilterIndex] = uigetfile(FilterSpec,DialogTitle,DefaultName)
% FileName:返回的文件名
% PathName:返回的文件的路径名
% FilterIndex:选择的文件类型
% FilterSpec:文件类型设置
% DialogTitle:打开对话框的标题
% DefaultName:默认指向的文件名
if ischar(filename) %ischar(tline)是判断tline变量是否是字符串类型的变量
video=VideoReader([pathname filename]);
%General Settings:
%Duration 时间
%Name 视频名称
%Path 路径
%Tag =
%Type = mmreader
%UserData = []
%%Video Settings:
%BitsPerPixel=24
%FrameRate 视频采集速率
%Height 高度
%NumberOfFrames 总帧数
%VideoFormat 图像模式
%Width = 宽度
LEN=video.NumberOfFrames; %获得视频长度
dir=strcat(pathname,strrep(filename,'.avi',''),'\pic');
mkdir(dir);
fn=strrep(filename,'.avi','');
for k=1:LEN-1 %若read到len,常会报错如下??? MATLAB:read:readTimedOut,read到len-1就好了
%frame=rgb2gray(read(video,k)); %将图像二值化,因为处理中进行二值化,故不在此使用
frame=read(video,k);
imwrite(frame,strcat(fn,'',int2str(k),'.jpg'),'jpg');%把每帧图像存入硬盘,直接存入当前目录

end
elseif iscell(filename)
navi=length(filename);
for n=1:navi
video=VideoReader([pathname filename{n}]);
%%General Settings:
%Duration 时间
%Name 视频名称
%Path 路径
%Tag =
%Type = mmreader
%UserData = []
%%Video Settings:
%BitsPerPixel=24
%FrameRate 视频采集速率
%Height 高度
%NumberOfFrames 总帧数
%VideoFormat 图像模式
%Width = 宽度
LEN=video.NumberOfFrames; %获得视频长度
dir=strcat(pathname,strrep(filename{n},'.avi',''),'\pic');
mkdir(dir);
fn=strrep(filename{n},'.avi','');
for k=1:LEN-1 %若read到len,常会报错如下??? MATLAB:read:readTimedOut,独到len-1就好了
frame=rgb2gray(read(video,k));
if k<10
imwrite(frame,strcat(dir,'\',fn,'000',int2str(k),'.jpg'),'jpg');%把每帧图像存入硬盘
elseif k>=10 && k<100
imwrite(frame,strcat(dir,'\',fn,'00',int2str(k),'.jpg'),'jpg');%把每帧图像存入硬盘
elseif k>=100 && k<1000
imwrite(frame,strcat(dir,'\',fn,'0',int2str(k),'.jpg'),'jpg');%把每帧图像存入硬盘
elseif k>=1000 && k<10000
imwrite(frame,strcat(dir,'\',fn,'',int2str(k),'.jpg'),'jpg');%把每帧图像存入硬盘
end
end
disp(strcat(num2str(n),'/',num2str(navi),' : "',filename{n},'" Finished!',datestr(now,13)));
end
else
return
end
msgbox('所有帧提取完毕,已写入磁盘!','提示');
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-11-20

VideoReader类可以读取视频文件,一帧一帧返回图像。

xyloObj = VideoReader('xylophone.mp4');
nFrames = xyloObj.NumberOfFrames;
vidHeight = xyloObj.Height;
vidWidth = xyloObj.Width;
for k = 1 : nFrames    
    I = read(xyloObj, k); % 读出第k帧
    ...
end

至于”关键帧“提取,就不知道你要用什么方法来判断是不是关键帧了。

追问

我想用
边界提取和K-Mean法聚类提取。我是小白,想学习下,咋样提取视频关键帧。要不要把视频分割了。能不能教教我。谢谢了

追答

你得先定义好什么叫”关键帧“,然后根据定义推导检测方法。这不是凭空想出来的。。

追问

好吧。我多研究研究!!

追答

加油吧。如果我的回答有帮助请采纳。

追问

请教下。该如何去改!

本回答被网友采纳
第2个回答  2014-03-17

clc;clear all;close all;



第3个回答  2014-03-31
用ffmpeg提取关键帧(I帧),然后在Matlab中调用!祝你成功,测试通过后发给我代码就行了,嘿嘿~~~
第4个回答  2014-03-07
可以去matlab中文论坛上逛逛会有所帮助的