如何使用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

+0

嗨Laleh谢谢你的答案。我已经看过那个复制页面,但是真的不知道发生了什么。您能否简单介绍一下它的功能以及为什么它可以用于视频对象? –

+0

声明:我要解释的更像是一种黑客,如果你在中间没有得到你正在做的事,就避免它!如果您希望能够使用VideoRead对象,则需要在每次迭代时复制它。为了做到这一点,类定义必须具有“matlab.mixin.Copyable”作为其超类。现在,VideoReader具有“hgsetget”和“matlab.mixin.CustomDisplay”作为超类,因此您需要添加“matlab.mixin.Copyable”,以便制作VideoRead的副本。打开工具箱\ matlab \ audiovideo \你已经安装matlab,你需要管理员帐户进行修改。 – Laleh

+0

谢谢laleh,我会研究它。 –