1

我有数千个 30sec/20fps/.avi 视频(所以每个视频总共 600 帧)。我需要自动对这些视频进行二次采样,以保存每 100 帧(每 5 秒)。任何图片格式都可以。

在 Matlab (R2015b) 或 Python + 库中是否有一种简单的方法可以做到这一点?

4

2 回答 2

1

在 MATLAB 中:

您可以使用VideoWriterobject 或imwrite,取决于所需的输出格式:

vin = VideoReader('vid1.mp4');
vout = VideoWriter('vid-out.mp4');
framenum = 0;
everyNframe = 100;
vout.open();
while vin.hasFrame
    frame = vin.readFrame;
    if rem(framenum,everyNframe) == 0
        vout.writeVideo(frame);
        % OR
        imwrite(frame, [num2str(framenum,'%04i') '.jpg']);
        disp(framenum)
    end
    framenum = framenum + 1;
end
vout.close();

另一种选择是通过设置将输入视频移到下一个所需帧vin.CurrentTime,但由于某种原因,它比简单地读取 100 帧要慢。

于 2017-03-30T16:25:06.363 回答
0

在 python 中,您可以使用scikit-video组合 withnumpy来执行此操作:

import skvideo.io

def subsample_and_write(filename, out_filename, n_steps):
    video_mat = skvideo.io.vread(filename)  # returns a NumPy array
    video_mat = video_mat[::n_steps]  # subsample
    skvideo.io.vwrite(out_filename, video_mat)
于 2021-09-01T02:56:59.230 回答