【问题标题】:how to select specific frames from a video in MATLAB?如何从 MATLAB 中的视频中选择特定帧?
【发布时间】:2014-04-14 14:01:01
【问题描述】:

我正在做一个关于唇形识别的项目,我必须以 30 fps 的帧速率阅读录制的视频,所以,如果我有 70 帧,我只需要每 8 帧获取或选择一个代表帧作为数据集中具有帧数的最短视频为 16 帧,但我的问题是每 8 帧调整一次 for 循环,它无法读取任何帧是视频阅读器的问题吗?所以,如果你有任何想法我将不胜感激 谢谢,,

v = VideoReader('1 - 1.avi');
s = floor((size(v,4))/8);
for t =1:s:size(v,4)
img = read(s,i);
y = imresize(img,[100,120];

【问题讨论】:

    标签: image matlab video frames


    【解决方案1】:

    您可以通过从视频中读取帧并将其存储在元胞数组中来完成此任务。从单元格数组中,您可以通过自定义 for 循环轻松读取所需的任何帧,如下所示。

    for i=1:8:n
      frame = cell{i};
      process(frame)
    end
    
    • 单元格:它包含视频中的所有帧

    • 进程:它是执行任务的函数

    • n:视频中的帧数

    如果您想获取更多关于从视频中读取帧并存储到元胞数组的信息,请访问以下链接:

    https://naveenideas.blogspot.in/2016/07/reading-frames-from-video.html

    【讨论】:

      【解决方案2】:

      我会拿example for VideoReader修改代码解释一下-

      %%// Paramters
      sampling_factor = 8;
      resizing_params = [100 120];
      
      %%// Input video
      xyloObj = VideoReader('xylophone.mpg');
      
      %%// Setup other parameters
      nFrames = floor(xyloObj.NumberOfFrame/sampling_factor); %%// xyloObj.NumberOfFrames;
      vidHeight = resizing_params(1); %// xyloObj.Height;
      vidWidth = resizing_params(1); %// xyloObj.Width;
      
      %// Preallocate movie structure.
      mov(1:nFrames) = struct('cdata', zeros(vidHeight, vidWidth, 3, 'uint8'),'colormap',[]);
      
      %// Read one frame at a time.
      for k = 1 :nFrames
          IMG = read(xyloObj, (k-1)*sampling_factor+1);
          %// IMG = some_operation(IMG);
          mov(k).cdata = imresize(IMG,[vidHeight vidWidth]);
      end
      
      %// Size a figure based on the video's width and height.
      hf = figure;
      set(hf, 'position', [150 150 vidWidth vidHeight])
      
      %// Play back the movie once at the video's frame rate.
      movie(hf, mov, 1, xyloObj.FrameRate);
      

      基本上,我所做的唯一更改是针对“nFrames”以及围绕它的其他因素。尝试更改“sampling_factor”,看看是否有意义。此外,我还在代码末尾添加了您正在执行的图像大小调整。

      【讨论】:

      • 太棒了!对于您刚刚提到的关于采样因子的部分,这确实是我想要的,非常感谢您,但是现在有一种方法可以分别对每个帧执行一些操作,因为我想从 RGB 更改为灰度格式以及特征提取需要处理每一帧本身而不是整部电影??为了获得更多许可,我可以单独显示每个框架吗??
      • 为了显示图像,您可以在 IMG 从“读取”命令获取数据后使用“imshow(IMG)”。如果您希望处理 RGB2GRAY、边缘检测等操作,您至少需要更改 struct mov 以仅接受来自每帧的 2D 数据。我认为,您仍然可以在这些 2D 数据上使用 imshow。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      • 2015-11-06
      相关资源
      最近更新 更多