如何使用 readframe 加载视频的每十帧?

How to load every tenth frame of the video using readframe?

我在 mMtlab 中使用函数 read() 加载框架。 我注意到 NOTE: READ 将在未来的版本中被删除。改用READFRAME。我寻找 readframe 的帮助,但我不知道该怎么做。我用来为 read():

编写代码
framesToRead = 1:10:numberOfFrames;
 for k=1:length(framesToRead)
   frameIdx = framesToRead(k);
   currentFrame   = read(VRef,frameIdx);

   allFrames(:,:,:,k) = currentFrame;
 end

你知道如何使用readframe吗?

readFrame 默认读取视频中的单帧。您别无选择,只能遍历所有帧并且自己只保存每第 10 帧。 readFrameVideoReader 框架的一部分,并且要在使用 VideoReader 读取视频时确定总帧数,很遗憾,我们无法访问简单的 属性 就像 numberOfFrames 就像在之前的视频中一样 reader MATLAB 工具。但是,您可以访问电影的总持续时间以及帧速率。

因此,您只需将电影的持续时间与帧速率相乘即可得出总帧数。如果您每 10 帧保存一次,我们可以预先分配一个包含尽可能多帧的矩阵,然后在您遇到的每 10 帧手动将这些帧放入矩阵中。

像这样的东西会起作用:

obj = VideoReader('...'); %// Place your video path here
width = obj.Width; %// Get width and height of the video
height = obj.Height;
numChannels = 3; %// Get number of channels.  Assuming RGB - Change if necessary
numberOfFrames = obj.Duration*obj.FrameRate; %// Calculate total number of frames to save

%// Determine total number of frames to save
totalFrames = floor(numberOfFrames/10);

allFrames = zeros(height,width,numChannels,totalFrames,'uint8'); %// Pre-allocate frames matrix

k = 0; %// Counts the total number of frames so far
count = 1; %// Keeps track of where to place frame
while hasFrame(obj)
    frm = readFrame(obj); %// Read frame
    k = k + 1; %// Increment count
    if mod(k,10) == 0 %// If we're at the 10th frame, save it
        allFrames(:,:,:,count) = frm;
        count = count + 1;
    end
end

代码的开头是不言自明的。我们只是使用 VideoReader 的属性来获取视频的宽度和高度,我假设您的视频是彩色的,每像素 8 位,因此通道总数为 3。我们还确定了数字帧数以及要保存的帧总数。

然后我们预先分配一个 4D 矩阵来保存我们的帧,然后我们使用 hasFrame 检查是否还有更多视频帧要读取。我们将其放入 while 循环并使用 readFrame 一次读取一个视频帧,检查此帧编号是否是 10 的倍数,如果是,则将其放入我们的帧中矩阵并继续前进。

现在,如果您最终想要显示框架,则可以使用以下方法:

for k = 1 : size(allFrames,4)
    imshow(allFrames(:,:,:,k));
    pause;
end

这会循环遍历每一帧并将其放入图形中,然后暂停并等待您按下一个键。这将在您按下一个键后遍历每一帧,直到结束。

老实说,我建议使用 ffmpeg 过滤帧序列。它比任何 Matlab 脚本都要强大和灵活得多。冒着提出我自己问题的风险,您可以了解如何使用 ffmpeg 作为帧过滤器 here