我正在尝试使用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
对象,不是吗?非常感谢帮助。
答案 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的值会使视频跳过每个循环中的帧数。希望对您有所帮助。