Matlab中的跳帧与电影文件检索
我试图在Matlab中处理一个视频,我使用Matlab中的跳帧与电影文件检索,matlab,video,Matlab,Video,我试图在Matlab中处理一个视频,我使用VideoReader读入该视频。我可以毫无问题地处理这些帧,但我只想处理每五帧。我尝试过使用step函数,但这对我的videoreader对象不起作用。现在我可以调用readFrame五次,但这显然会减慢整个过程(视频素材太多)。如何有效地跳过五帧、处理五帧、跳过另五帧。。。使用Matlab 错误消息: 类型为“VideoReader”的输入参数的未定义函数“step” 但是,在步骤上调用帮助函数会得到以下示例: WORKED=step(VR,DELT
VideoReader
读入该视频。我可以毫无问题地处理这些帧,但我只想处理每五帧。我尝试过使用step函数,但这对我的videoreader对象不起作用。现在我可以调用readFrame
五次,但这显然会减慢整个过程(视频素材太多)。如何有效地跳过五帧、处理五帧、跳过另五帧。。。使用Matlab
错误消息:类型为“VideoReader”的输入参数的未定义函数“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.
在这里,
步骤
显然是在视频阅读器
对象上调用的,不是吗?非常感谢您的帮助。我也遇到过这个问题。在不使用不推荐的代码的情况下,执行您正在尝试的操作的唯一方法是为每个输出帧调用五次。这是缓慢和非常低效的。但是,如果使用不推荐的方法(并且假设视频是文件而不是流),也可以指定帧编号。我不知道为什么数学在这方面倒退了。我建议您询问一下,并说明为什么此功能对您很重要
同时,您可以尝试我的功能,从视频文件中提取特定帧。它尝试使用不推荐的
read
方法,如果失败,则返回到readFrame
。我发现在我自己的应用程序中,使用1080p60fps的MPEG-4视频,读取方法的速度要快十倍。请随意修改代码以满足您的需要。我也遇到过这个问题。在不使用不推荐的代码的情况下,执行您正在尝试的操作的唯一方法是为每个输出帧调用五次。这是缓慢和非常低效的。但是,如果使用不推荐的方法(并且假设视频是文件而不是流),也可以指定帧编号。我不知道为什么数学在这方面倒退了。我建议您询问一下,并说明为什么此功能对您很重要
同时,您可以尝试我的功能,从视频文件中提取特定帧。它尝试使用不推荐的read
方法,如果失败,则返回到readFrame
。我发现在我自己的应用程序中,使用1080p60fps的MPEG-4视频,读取方法的速度要快十倍。请随意修改代码以满足您的需要。不知道这是否仍然有用,但我已经找到了解决这个问题的方法
当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的值会使视频跳过每个循环中的帧数。我希望这能有所帮助。我不知道这是否仍然有用,但我已经找到了解决这个问题的方法
当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的值会使视频跳过每个循环中的帧数。我希望这有帮助。什么Matlab版本?VR
不等于VR
。接下来的和getframe
函数是什么?你是如何调用step
的?为什么step
要在里面创建自己的VideoReader
对象?是你编写的step
函数,还是它实际上来自于的方法?什么Matlab版本?VR
不等于VR
。接下来的和getframe
函数是什么?您如何调用step
,为什么step
要在里面创建自己的VideoReader
对象?是您编写的step
函数还是实际上来自的方法?谢谢您的快速回答!我将试用read函数,看看它是否能加快进程。谢谢你快速的回答!我将试用read函数,看看它是否能加快进程。