如何使用readframe加载视频的每十个帧?

时间:2016-03-03 16:51:59

标签: matlab image-processing video-processing

我在mMtlab中使用了函数read()来加载帧。 我注意到:在将来的版本中将删除READ。请改用READFRAME。我查看了readframe的帮助,但我不知道该怎么做。我用来代码读取():

framesToRead = 1:10:numberOfFrames;
 for k=1:length(framesToRead)
   frameIdx = framesToRead(k);
   currentFrame   = read(VRef,frameIdx);

   allFrames(:,:,:,k) = currentFrame;
 end

您知道如何使用readframe吗?

2 个答案:

答案 0 :(得分:2)

默认情况下,

readFrame会在您的视频中读取单帧。你没有选择,只能循环遍历所有帧,并且自己只保存每10帧。 readFrameVideoReader框架的一部分,为了确定使用VideoReader阅读视频时的总帧数,我们很遗憾无法访问像{{{{}}这样的简单属性1}}与之前的MATLAB视频阅读器工具一样。但是,您可以访问电影的总持续时间以及帧速率。

因此,您只需将电影的持续时间与帧速率相乘,即可找到总帧数。我们可以预先分配一个矩阵,该矩阵将包含与每10帧保存一样多的帧,然后在遇到的每10帧手动将这些帧放置在矩阵中。

这样的事情会起作用:

numberOfFrames

代码的开头是不言自明的。我们只是使用obj = VideoReader('...'); %// Place your video path here width = obj.Width; %// Get width and height of the video height = obj.Height; numChannels = 3; %// Get number of channels. Assuming RGB - Change if necessary numberOfFrames = obj.Duration*obj.FrameRate; %// Calculate total number of frames to save %// Determine total number of frames to save totalFrames = floor(numberOfFrames/10); allFrames = zeros(height,width,numChannels,totalFrames,'uint8'); %// Pre-allocate frames matrix k = 0; %// Counts the total number of frames so far count = 1; %// Keeps track of where to place frame while hasFrame(obj) frm = readFrame(obj); %// Read frame k = k + 1; %// Increment count if mod(k,10) == 0 %// If we're at the 10th frame, save it allFrames(:,:,:,count) = frm; count = count + 1; end end 的属性来获取视频的宽度和高度,我假设您的视频是彩色的,每像素8位,因此通道总数为3.我们还确定了数字框架以及要保存的总帧数。

然后我们预先分配一个4D矩阵来保存我们的帧,然后我们使用hasFrame检查我们是否还有更多的视频帧要读取。我们将其放入VideoReader循环并使用while一次读取一个视频帧,检查此帧号是否为10的倍数,如果是,请将其放入我们的帧中矩阵并继续前进。

现在,如果你最终想要展示框架,那么这样的东西可以起作用:

readFrame

这会循环显示每个帧并将其放入图中并暂停并等待您按下一个键。按下一个键直到结束后,这将遍历每一帧。

答案 1 :(得分:2)

老实说,我建议使用ffmpeg过滤您的帧序列。它比任何Matlab脚本都强大和灵活。冒着自己提出问题的风险,您可以了解如何使用ffmpeg作为框架过滤器here