如何使用Matlab分析并行视频帧?
我正在处理大型视频文件逐帧处理。每个帧的处理都与其他帧无关(解压缩时),并且也是计算密集型的,所以我认为并行处理是加速我的分析的一个好方法。虽然我自学了使用并行循环的基础知识,但我遇到了将parfor的具体细节与VideoReader对象结合的问题。在我心目中,我想象运行这样如何使用Matlab分析并行视频帧?
video = VideoReader('video.mp4');
parfor ii = 1 : 90000
frame = read(video, ii);
...analysis on frame...
end
代码然而,这提醒我不要使用阅读(),因为它会在将来的版本中删除,所以我知道的唯一选择是使用frameRead()。然而,frameRead使用VideoReader对象的CurrentTime属性,每次调用frameRead时它都会自行增加(根据fps)。这对正常循环中的帧读取工作正常,但它使parfor不高兴,因为每个帧都依赖于根据最后一个增加CurrentTime。有没有办法使用readFrame或其他方式访问并行循环中的独立帧?我已经尝试通过使用循环索引和帧速率这样来设置在每次循环中CURRENTTIME值:
video = VideoReader('video.mp4');
fps = video.FrameRate
results = cell(totalFrames, 1);
parfor ii = 1 : 900000
video.CurrentTime = ii/fps;
frame = readFrame(video);
results{ii} = customAnalysisFunction(frame)
end
在这个例子中PARFOR有下划线/标记和其原因是在该消息中提供:
MATLAB runs loops in parfor functions by dividing the loop iterations into
groups,and then sending them to MATLAB workers where they run in parallel.
For MATLAB to do this in a repeatable, reliable manner, it must be able to
classify all the variables used in the loop. The code uses the indicated
variable in a way that is incompatible with classification
我可以采取哪些步骤来并行读取兼容的视频帧?
我应该只使用读取功能吗?我不应该有什么原因?有没有其他的Matlab视频工具?
经常向我暗示的一个解决方案是,为什么不将视频分割成单独的剪辑?我不想这样做,因为它非常慢,需要很多额外的步骤和文件处理。它很难相信在Matlab中没有解决这个问题的方法,所以我很期待你的答案!
我不希望并行阅读框架可以在MATLAB中工作。视频阅读器是一个对象,它具有关于它所处位置的内部状态。您可能会尝试使用该对象的副本。看看这个: http://mathworks.com/help/matlab/ref/matlab.mixin.copyable-class.html
嗨Laleh谢谢你的答案。我已经看过那个复制页面,但是真的不知道发生了什么。您能否简单介绍一下它的功能以及为什么它可以用于视频对象? –
声明:我要解释的更像是一种黑客,如果你在中间没有得到你正在做的事,就避免它!如果您希望能够使用VideoRead对象,则需要在每次迭代时复制它。为了做到这一点,类定义必须具有“matlab.mixin.Copyable”作为其超类。现在,VideoReader具有“hgsetget”和“matlab.mixin.CustomDisplay”作为超类,因此您需要添加“matlab.mixin.Copyable”,以便制作VideoRead的副本。打开工具箱\ matlab \ audiovideo \你已经安装matlab,你需要管理员帐户进行修改。 – Laleh
谢谢laleh,我会研究它。 –