在旧版本的MATLAB中,可以执行
V = VideoReader(filename);
for i = 1 : 10 : 1000
sampled = read(V, i);
end
从视频中采样帧(在这种情况下每10秒)。我也想*我记得有一个V.NumberOfFrames
字段实际存储了视频中的帧数。
自从MATLAB 2015a(我相信......它肯定在这个版本之后),他们已经重做了他们的VideoReader
类和成员函数。现在要获得帧数,必须进行V.Duration * V.FrameRate
,并且采样不再像在读取调用中选择帧索引那样简单。 read()
现已弃用,应由readFrame()
替换。此外,现在拍摄视频要困难得多(而且速度慢)。根据文档,现在应该读取视频
V = VideoReader(filename);
while hasFrame(V)
frame = readFrame(V);
end
出于抽样目的,似乎必须做以下两件事之一:
1)插入模数if语句,但仍然读取每一帧
i = 0;
V = VideoReader(filename);
while hasFrame(V)
readFrame(V);
if mod(i, samplingRate)
sampled = readFrame(V);
end
i = i + 1;
end
这种方法非常慢。对于许多视频处理来说,似乎方法稍微快一些,但
2)基于时间而不是帧的样本
readFrame
文档显示了用户如何使用V.CurrentTime = x
设置开始时间。我想这适用于像
t = 0
V = VideoReader(filename);
while hasFrame(V)
V.CurrentTime = t;
sampled = readFrame(V);
t = t + samplingPeriod;
end
这种方法仍然非常缓慢。
这种变化似乎要么对采样过程进行模糊处理,要么大幅放慢采样过程。这个变化有解释吗?我是否错过了一些不同的第三种视频采样方法,可能更快?