私は大きなビデオファイルをフレームごとに処理しています。各フレームの処理は、他のフレームとは独立しており(圧縮解除されると)、計算が集中しているので、並列処理は分析を高速化するのに最適です。私は並列ループを使う基本を教えてきましたが、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ではこの問題の解決策がないとは考えにくいので、私はあなたの答えを楽しみにしています!
こんにちはLalehは答えてくれてありがとう。私は前にそのコピーのページを見てきましたが、実際に何が起こっていたのか理解できませんでした。これが何をしているのか、それがビデオオブジェクトでうまくいく理由について簡単に説明してください。 –
免責事項:私が説明しようとしていることは、ハックのようなものです。あなたが真ん中でやっていることを得られないなら、避けてください! VideoReadオブジェクトを使用できるようにするには、繰り返しごとにそのコピーを作成する必要があります。これを行うには、クラス定義にそのスーパークラスとして "matlab.mixin.Copyable"がなければなりません。 VideoReaderはスーパークラスとして "hgsetget"と "matlab.mixin.CustomDisplay"を持っていますので、VideoReadのコピーを作成できるように "matlab.mixin.Copyable"を追加する必要があります。ツールボックス\ matlab \ audiovideo \を開き、matlabをインストールしていて、変更するには管理者アカウントが必要です。 – Laleh
ありがとうlaleh、私はそれを調べます。 –