【问题标题】:Subsampling videos to save every Nth frame对视频进行二次采样以保存每 N 帧
【发布时间】:2017-08-24 16:30:54
【问题描述】:

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

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

【问题讨论】:

  • 我认为 ffmpeg 会是一个更好、更有效的工具。
  • 可以跨多个子目录自动执行吗?
  • 当然。通过一些 bash 或 python 脚本,它应该能够做到这一点。我建议搜索并尝试一下。

标签: python matlab video subsampling


【解决方案1】:

在 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 将输入视频移动到下一个所需帧,但由于某种原因,它比简单地读取 100 帧要慢。

【讨论】:

  • 我收到错误Undefined variable "v" or class "v.readFrame". Error in testsubsample (line 7) frame = v.readFrame; 我应该指定视频格式为.avi,是这个原因吗?
  • 我的错...修复了它。 'avi' 对 matlab 来说很好
  • 谢谢,但我现在又遇到了一个错误。有点长,我把它添加到我的原始帖子中
  • 我又坏了...再次修复它,我今天很困惑...:)
【解决方案2】:

在Python中,您可以使用scikit-video 987654322 @来执行以下操作:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 2011-07-26
    相关资源
    最近更新 更多