【发布时间】:2017-07-05 11:46:49
【问题描述】:
我正在逐帧处理大型视频文件。每个帧的处理独立于其他帧(解压缩时)并且计算量也很大,因此我认为并行处理将是加快分析速度的好方法。虽然我已经自学了使用并行循环的基础知识,但我在将 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 中没有解决此问题的方法,所以我期待您的回答!
【问题讨论】:
标签: matlab video parallel-processing parfor