在Matlab中

时间:2016-02-11 13:30:43

标签: matlab video

我正在尝试使用VideoReader在Matlab中处理视频。我可以毫无问题地处理帧,但我只想处理每五帧。我尝试使用step函数,但这不适用于我的videoreader对象。现在我可以拨打readFrame五次,但这显然会减慢整个过程(很多视频资料)。我怎样才能有效地跳过5帧,处理5帧,跳过另外5帧,...使用Matlab?

  

错误讯息:
  未定义的函数'step'用于'VideoReader'类型的输入参数。

但是,在help上调用step函数会让我举个例子:

WORKED=step(VR,DELTA)
Moves the frame counter by DELTA frames for video VR.  This is a 
generalization of NEXT.  Returns 0 on an unsuccessful step.  Note that 
not all plugins support stepping, especially with negative numbers.  In 
the following example, both IM1 and IM2 should be the same for most 
plugins.
  vr = videoReader(...myurl...);
  if (~next(vr)), error('couldn''t read first frame'); end
      im1 = getframe(vr);
  if (~step(vr,-1)), error('could not step back to frame 0'); end
      im2 = getframe(vr);
  if (any(im1 ~= im2)), 
      error('first frame and frame 0 are not the same'); 
  end
  vr = close(vr);
FNUM should be an integer.

After the videoReader constructor is called, NEXT, SEEK, or step should
be called at least once before GETFRAME is called. 

在这里,step明确地调用VideoReader对象,不是吗?非常感谢帮助。

2 个答案:

答案 0 :(得分:3)

我也遇到过这个问题。如果不使用已弃用的代码,执行所尝试操作的唯一方法是为每个输出帧调用readFrame五次。这很慢且非常低效。但是,如果您使用弃用的read方法(假设您的视频是文件而不是流),您也可以指定帧编号。我不知道为什么MathWorks已经倒退了。我建议你file a service request询问一下,并说明为什么这个功能对你很重要。

与此同时,您可以试用我的frame2jpg功能,从视频文件中提取特定的帧。它会尝试使用已弃用的read方法,如果失败则会回退到readFrame。我发现read方法在我自己的应用程序中使用1080p 60 fps MPEG-4视频要快十倍。随意修改代码以满足您的需求。

答案 1 :(得分:0)

不知道这是否仍然有用,但是我找到了解决此问题的方法。

当readFrame读取vid.CurrentTime属性提供的CURRENT帧时,您可以简单地将该属性前进要跳过的帧数。

vid = VideoReader('myvid.mpeg')
vidFig = figure();
currAxes = axes;

n = 10;

while hasFrame(vid) 
vidFrame = readFrame(vid);
vid.CurrentTime = vid.CurrentTime + n/vid.FrameRate; 
image(vidFrame, 'Parent', currAxes);
currAxes.Visible = 'off';
end

更改n的值会使视频跳过每个循环中的帧数。希望对您有所帮助。