Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Matlab并行分析视频帧?_Matlab_Video_Parallel Processing_Parfor - Fatal编程技术网

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

如何使用Matlab并行分析视频帧?,matlab,video,parallel-processing,parfor,Matlab,Video,Parallel Processing,Parfor,我正在一帧一帧地处理大型视频文件。每个帧的处理独立于其他帧(解压缩时),并且计算量也很大,因此我认为并行处理将是加快分析速度的一个好方法。虽然我自学了使用并行循环的基础知识,但我在将parfor的细节与VideoReader对象结合起来时遇到了问题。在我看来,我想象代码是这样运行的 video = VideoReader('video.mp4'); parfor ii = 1 : 90000 frame = read(video, ii); ...analysis on

我正在一帧一帧地处理大型视频文件。每个帧的处理独立于其他帧(解压缩时),并且计算量也很大,因此我认为并行处理将是加快分析速度的一个好方法。虽然我自学了使用并行循环的基础知识,但我在将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
我可以采取哪些步骤来并行读取兼容的视频帧

我应该只使用read函数吗?我不应该这样做的原因是什么?是否有其他用于Matlab的视频工具


我经常想到的一个解决方案是,为什么不把视频分割成不同的片段呢?我不想这样做,因为它非常慢,需要很多额外的步骤和文件处理。很难相信在Matlab中没有解决这个问题的方法,所以我期待着你的答案

我不希望并行读取帧在MATLAB中工作。视频读取器是一个对象,其内部状态与位置有关。您可以尝试使用对象的副本。看看这个:

你好,拉里,谢谢你的回答。我以前看过那个复印页,但真的不明白发生了什么。你能简单地解释一下这是怎么做的吗?为什么它会对视频对象起作用?免责声明:我要解释的更像是一个黑客,如果你没有得到你正在做的事情,就避免它!如果您希望能够使用VideoRead对象,您需要在每次迭代中复制它。要做到这一点,类定义必须将“matlab.mixin.Copyable”作为其超类。现在,VideoReader将“hgsetget”和“matlab.mixin.CustomDisplay”作为超类,因此您需要添加“matlab.mixin.Copyable”,以便可以制作VideoRead的副本。打开toolbox\matlab\audiovideo\安装matlab的地方,需要管理员帐户进行修改。谢谢laleh,我会调查一下。我没有管理“黑客”,所以我认为这个问题已经解决了