如何在Matlab中通过帧索引读取特定视频帧?

时间:2019-04-10 07:13:28

标签: matlab

我正在研究一种算法,该算法按索引获取单个视频帧,对其进行处理,并获取新索引的下一个视频帧。

我正在使用Matlab VideoReader函数读取视频文件。要读取下一帧,它提供了readFrame函数。

readFrame函数可以占用帧的时间并在该时间读取该特定帧。如何使用它读取给定索引下的特定帧?

我正在Linux中使用Matlab 2016b。我有mmread函数,该函数需要视频文件名和帧索引来读取帧。但是此文件取决于Windows 64位编译的Matlab函数文件,因此我不能使用它。

这是我的使用方式:

for i = startIdx:endIdx
    frame = mmread(filename, i);
    ...
    processing the frame
    ...
end

这是我从Windows中获得的link到mmread函数。

2 个答案:

答案 0 :(得分:1)

您可以使用read函数。但是,文档显示不建议这样做(我不知道为什么)。

v = VideoReader(filename);

for i = startIdx:endIdx
    frame = read(v,i);
    ...
    processing the frame
    ...
end

答案 1 :(得分:1)

通过@ ga97dil添加答案。正如他所说,Matlab建议不要使用read函数,而建议使用VideoReader.readFrame函数来读取帧。

由于此函数不是将帧索引作为参数,而是特定时间来读取帧,所以我想如果可以将特定帧索引转换为其视频中的时间怎么办。稍作搜索后,我发现this线程是一种解决方案。

这是我定义新mmread.m函数的方式

function [ frame ] = mmread_1(filename, frameIdx)
    v = VideoReader(filename);  % read the video file
    v.CurrentTime = (frameIdx - 1) / v.FrameRate;  % calculate the time for the given frame index
    frame = readFrame(v);  % read the frame
end

由于Matlab建议不要使用读取功能(可能在将来的版本中将其删除),由于可移植性,我宁愿不使用它。