2017-07-05 12 views
0

私は大きなビデオファイルをフレームごとに処理しています。各フレームの処理は、他のフレームとは独立しており(圧縮解除されると)、計算が集中しているので、並列処理は分析を高速化するのに最適です。私は並列ループを使う基本を教えてきましたが、parforの仕様とVideoReaderオブジェクトを組み合わせるのに問題があります。私の心の中で私は、それが将来のバージョンで削除されますので、しかし、これはread()は使用しないことを私に警告しているコードは、このMatlabを使用してビデオフレームを並行して分析する方法は?

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

のように実行している想像して、私が知っている唯一の選択肢は、の()frameReadを使用することです。ただし、frameReadはVideoReaderオブジェクトのCurrentTimeプロパティを使用します。これはframeReadが呼び出されるたびに(fpsに従って)インクリメントします。これは通常のループでフレームを読み込むのには問題ありませんが、各フレームは最後にCurrentTimeを増やす必要があるため、parforは不幸になります。 readFrameなどを使って並列ループ内の独立したフレームにアクセスする方法はありますか? Iはループインデックスと、このようなフレームレートを用いて各ループ内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用の他のビデオツールはありますか?

私にはしばしば示唆されている解決策の1つは、ビデオを別々のクリップに分割してみましょう。私は非常に遅く、余分なステップとファイルの処理がたくさん必要なので、これをやりたいとは思わない。 Matlabではこの問題の解決策がないとは考えにくいので、私はあなたの答えを楽しみにしています!

答えて

1

フレームを読み込むことは、MATLABではうまくいくとは思いません。ビデオリーダは、その位置にある内部状態を持つオブジェクトです。オブジェクトのコピーを操作しようとする可能性があります。これを見て: http://mathworks.com/help/matlab/ref/matlab.mixin.copyable-class.html

+0

こんにちはLalehは答えてくれてありがとう。私は前にそのコピーのページを見てきましたが、実際に何が起こっていたのか理解できませんでした。これが何をしているのか、それがビデオオブジェクトでうまくいく理由について簡単に説明してください。 –

+0

免責事項:私が説明しようとしていることは、ハックのようなものです。あなたが真ん中でやっていることを得られないなら、避けてください! VideoReadオブジェクトを使用できるようにするには、繰り返しごとにそのコピーを作成する必要があります。これを行うには、クラス定義にそのスーパークラスとして "matlab.mixin.Copyable"がなければなりません。 VideoReaderはスーパークラスとして "hgsetget"と "matlab.mixin.CustomDisplay"を持っていますので、VideoReadのコピーを作成できるように "matlab.mixin.Copyable"を追加する必要があります。ツールボックス\ matlab \ audiovideo \を開き、matlabをインストールしていて、変更するには管理者アカウントが必要です。 – Laleh

+0

ありがとうlaleh、私はそれを調べます。 –

関連する問題