如何使用Matlab并行分析视频帧?

时间:2017-07-05 11:46:50

标签: matlab video parallel-processing parfor

我正在逐帧处理大型视频文件。每个帧的处理独立于其他帧(当解压缩时)并且也是计算密集型的,因此我认为并行处理将是加速我的分析的好方法。虽然我自学了使用并行循环的基础知识,但我在将parfor的细节与VideoReader对象结合起来时遇到了问题。在我看来,我想象代码就像这样运行

 video = VideoReader('video.mp4'); 
 parfor ii = 1 : 90000
     frame = read(video, ii);
     ...analysis on frame...
 end

然而,这警告我不要使用read(),因为它将在未来版本中删除,所以我知道的唯一选择是使用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中没有解决这个问题的方法,所以我期待你的回答!

1 个答案:

答案 0 :(得分:1)

我不希望并行读取帧可以在MATLAB中使用。视频阅读器是一个对象,它具有关于它所处位置的内部状态。您可能尝试使用该对象的副本。看看这个: http://mathworks.com/help/matlab/ref/matlab.mixin.copyable-class.html