对视频进行子采样以保存每第 N 帧
Subsampling videos to save every Nth frame
我有数千个 30sec/20fps/.avi 视频(因此每个视频总共有 600 帧)。我需要自动对这些视频进行子采样,以便每 100 帧(每 5 秒)保存一次。任何图片格式都可以。
有没有在 Matlab (R2015b) 或 Python+ 库中执行此操作的简单方法?
在 MATLAB 中:
您可以使用 VideoWriter
对象或 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
将输入视频 ffwd 到下一个所需的帧,但由于某些原因,它比简单地读取 100 帧要慢。
在 python 中,您可以将 scikit-video
与 numpy
结合使用:
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)
我有数千个 30sec/20fps/.avi 视频(因此每个视频总共有 600 帧)。我需要自动对这些视频进行子采样,以便每 100 帧(每 5 秒)保存一次。任何图片格式都可以。
有没有在 Matlab (R2015b) 或 Python+ 库中执行此操作的简单方法?
在 MATLAB 中:
您可以使用 VideoWriter
对象或 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
将输入视频 ffwd 到下一个所需的帧,但由于某些原因,它比简单地读取 100 帧要慢。
在 python 中,您可以将 scikit-video
与 numpy
结合使用:
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)