【问题标题】:Convert Video to Image Sequence MATLAB将视频转换为图像序列 MATLAB
【发布时间】:2023-03-04 13:31:02
【问题描述】:

我正在尝试将视频转换为图像序列,并且在 mathworks 我看到了这样的代码

读取和播放电影文件 xylophone.mp4。

xyloObj = VideoReader('xylophone.mp4');

nFrames = xyloObj.NumberOfFrames;
vidHeight = xyloObj.Height;
vidWidth = xyloObj.Width;

预分配电影结构。

mov(1:nFrames) = ...
    struct('cdata',zeros(vidHeight,vidWidth, 3,'uint8'),...
           'colormap',[]);

一次读取一帧。

for k = 1 : nFrames
    mov(k).cdata = read(xyloObj,k);
end

当我尝试这段代码时,编译它需要很长时间。有什么方法可以在不循环的情况下读取所有帧,这样我可以让它更快?

【问题讨论】:

    标签: matlab image-processing video


    【解决方案1】:

    无论您做什么,都需要很长时间。您正在做的是解压缩每一帧并将原始 RGB 帧放入内存中。因此,时间花在 I/O 和将帧解码为 RGB 上。但是,从长远来看,对您来说更快的方法是先通过单个 read 调用批量读取一堆帧,然后它们可供以后使用。

    read 方法允许您指定一个双元素向量作为第二个输入,告诉 MATLAB 您要读取的帧范围。例如,如果您想读取前 10 帧,请执行以下操作:

    video = read(xyloObj, [1 10]);
    

    video 是一个 4 维数组,其中第一维是框架的高度,第二维是宽度,第三维是颜色通道的数量(通常为 3),第四维是框架数字。因此,如果您想访问ith 框架,您可以:

    frame = video(:,:,:,i);
    

    此外,如果您在没有第二个参数的情况下调用read,则会从头到尾读取所有帧。因此,您也可以这样做:

    video = read(xyloObj);
    

    xylophone.mp4 文件(在我的电脑上)中,有 141 帧,在我的电脑上执行上述操作大约需要 13 秒。我的配置是 Mac OS Yosemite 10.10.3,在 Intel Core i7 2.3 GHz 上运行 MATLAB R2013a 和 16 GB RAM。从我们之前讨论的内容来看这是有道理的,现在帧可以作为 4D 矩阵使用。

    因此,也许可行的一件事是使用read 并在不循环的情况下读取所有帧。如果这很慢,那么也许您可以一次读取每 10 或 20 帧左右的帧,处理帧,然后继续下一批......所以像这样:

    for idx = 1 : 20 : nFrames
        if idx + 20 > nFrames
            endIndex = nFrames;
        else
            endIndex = idx + 20;
        end
        video = read(xyloObj, [idx endIndex-1]);
    
        %// Continue processing
    end
    

    但是,如果您只使用 read 命令本身而没有任何第二次输入,如果您可以等待大约 13 秒左右,那就完全没问题了。除此之外,如果您真的想稍后使用这些框架,您可以随时使用save 并将这些框架存储在一个 MAT 文件中,以便于加载和以后使用。

    【讨论】:

    • 那么如果我在读取帧后直接处理视频呢?如果我先将视频转换为图像序列,会有什么不同吗?
    • @BrilianAringga - 不是真的没有!不管你做什么,都需要很长时间。需要很长时间的原因是由于 I/O 和解压缩帧。您首先要将其转换为图像序列的原因是您只需调用一次read。一旦你这样做了,那么只需要切入图像序列矩阵以获得你需要的帧。但是,这会占用大量内存,因此您必须决定什么对您来说更好、更容易……要么一次读取一帧,要么一次完成所有操作。
    • 哦,我明白了!所以我可以减少时间过程,因为我不需要再次读取框架对吗?
    • @BrilianAringga - 没错!只需致电read 一次,现在框架将在此之后可供您使用。 :) 我已经编辑了我的帖子以反映这一点。
    • 我现在明白了,非常感谢 @rayryeng 大师的解释 xD
    猜你喜欢
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    相关资源
    最近更新 更多