【问题标题】:How to extract frames at particular intervals from video using matlab如何使用matlab从视频中提取特定间隔的帧
【发布时间】:2015-01-22 09:14:54
【问题描述】:

我正在为我的项目使用 matlab 2013a 软件。

我在将视频分割成单个帧时遇到问题。

我想知道如何从视频中以特定间隔获取帧。即,我想以每秒一帧(帧/秒)的速率抓取帧。我的输入视频有 50 帧/秒。在代码中,我使用 step() 将视频分割成帧。

以下是我的代码,基本上是人脸检测代码(检测视频中的多个人脸)。此代码捕获视频中的每一帧(即大约 50fp)并对其进行处理。我想以 1 fps 的速率处理帧。请帮帮我。

clear classes;
videoFileReader = vision.VideoFileReader('C:\Users\Desktop\project\05.mp4');
**videoFrame      = step(videoFileReader);**
faceDetector = vision.CascadeObjectDetector(); % Finds faces by default
tracker = MultiObjectTrackerKLT;
videoPlayer  = vision.VideoPlayer('Position',[200 100       fliplr(frameSize(1:2)+30)]);

bboxes = [];
while isempty(bboxes)
  **framergb = step(videoFileReader);**
  frame = rgb2gray(framergb);
  bboxes = faceDetector.step(frame); 
end

tracker.addDetections(frame, bboxes);
frameNumber = 0;
keepRunning = true;

while keepRunning

   **framergb = step(videoFileReader);**
   frame = rgb2gray(framergb);

   if mod(frameNumber, 10) == 0
      bboxes = 2 * faceDetector.step(imresize(frame, 0.5));
      if ~isempty(bboxes)
        tracker.addDetections(frame, bboxes);
      end
   else
    % Track faces
    tracker.track(frame);
   end
end

%% Clean up
release(videoPlayer);

但这实际上考虑了每一帧。我要抓1fps。

【问题讨论】:

  • 谢谢,但我已经成功地将视频分割成帧,问题是我需要一些指导来从 50 帧中选择一个关键帧。我是 matlab 新手,所以我寻求一些帮助。
  • 这是我的人脸检测代码。我需要处理一个视频样本,但问题是因为视频是 50fps,所以处理速度很慢。所以我想提取 1 fps 并尝试处理它 framergb = step(videoFileReader);帧 = rgb2gray(framergb); bboxes = faceDetector.step(frame) 。这实际上考虑了每一帧。我想抢1fps。请指导我的过程
  • 我已经编辑了该代码 sn-p,以提供帮助。在 Stack Overflow 上,最好在问题中显示您的代码(使用问题下的“编辑”链接进行更改并改进您的问题)。我仍然不是 100% 清楚问题是什么,但我认为其他对 Matlab 视频库了解更多的人可能已经理解或问你正确的问题来澄清你在做什么。
  • 我已经分享了我的全部代码。请检查您是否可以提供帮助。需要明确的是,代码从输入视频中捕获每一帧并处理每一帧以检测人脸。现在的问题是如果输入视频是 50fps ,这会导致处理速度下降。所以我只想捕获 1fps 并处理该帧以检测人脸。
  • 感谢您的帮助,我已经完成了所有的更正,并且我还突出了需要帮助的部分。可能,我想至少现在你应该明白问题到底是什么了。

标签: image matlab video matlab-cvst


【解决方案1】:

不能直接在 Matlab 2013a 中完成,因为视频访问库没有提供你想要的功能。仅使用 Matlab 代码编写必要的代码来实现有效的跳帧例程是不可能的(您需要查看视频库)

解决这个问题,您有两个基本选择:

  1. 对不想处理的帧做尽可能少的工作。

你目前在哪里

framergb = step(videoFileReader);

改为做类似的事情

for i=1:49,
  step(videoFileReader);
end
framergb = step(videoFileReader);

(注意这不允许超出输入的结尾)

  1. 使用 ffmpeg 等工具对文件进行预处理,并在使用 Matlab 之前降低帧速率。

ffmpeg 命令可能如下所示:

ffmpeg -i 05.mp4 -r 1 05_at_1fps.mp4

【讨论】:

  • 加 1 - 我个人也会选择ffmpeg。
猜你喜欢
  • 2019-03-29
  • 2015-11-06
  • 1970-01-01
  • 2014-09-07
  • 2014-04-14
  • 2018-03-09
  • 1970-01-01
  • 2013-12-22
  • 2021-12-31
相关资源
最近更新 更多