我试图在Matlab中处理一个我用VideoReader读取的视频。我可以在没有问题的情况下处理这些帧,但我只想每五帧处理一次。我尝试使用step函数,但这在我的视频读取器对象上行不通。现在我可以给readFrame打五次电话,但这显然会减慢整个过程(这是大量的视频材料)。我如何有效地跳过五帧,处理五帧,跳过另五帧,.用Matlab?
错误消息: 对于输入参数“VideoReader”,更高级的未定义函数“step”。
但是,在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对象上调用的,不是吗?我们将非常感谢您的帮助。
发布于 2016-02-11 17:34:39
我也有过这个问题。在不使用不推荐的代码的情况下,您尝试的唯一方法是对每个输出帧调用readFrame 5次。这是缓慢和非常低效的。但是,如果使用不推荐的read方法(假设视频是文件而不是流),也可以指定帧号。我不知道为什么MathWorks会在这个问题上倒退。我建议您使用提交服务请求来询问它,并说明为什么这个功能对您很重要。
同时,您可以尝试我的frame2jpg函数,该函数从视频文件中提取特定的帧。它尝试使用不推荐的read方法,如果失败,则返回到readFrame。我发现在我自己的应用程序中,read方法的速度是1080 p 60 fps MPEG-4视频的10倍。请随意修改代码以满足您的需要。
发布于 2019-01-30 14:45:19
不知道这是否还有用,但我找到了解决这个问题的方法。
当readFrame读取由vid.CurrentTime属性提供的当前帧时,您可以简单地按要跳过的帧数量来推进该属性。
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的值使视频跳过每一个循环的帧数。希望这能帮上忙。
https://stackoverflow.com/questions/35340695
复制相似问题