2016-12-07 5 views
-1

私はビデオファイルを読んでいて、イメージの処理をしていなくてもファイルの実際のFPS(10 Fの59 FPS)より遅いです:opencvでファイルからビデオキャプチャでFPSを変更

 using namespace cv; 
     using namespace std; 
     // Global variables 
     UMat frame; //current frame 
     int main(int argc, char** argv) 
     { 

       VideoCapture capture("myFile.MP4"); 
       namedWindow("Frame"); 
       capture.set(CAP_PROP_FPS, 120); //not changing anything 
       cout>>capture.get(CAP_PROP_FPS); 
       while (charCheckForEscKey != 27) { 

         capture >>frame; 
       if (frame.empty()) 
        break; 
       imshow("Frame", frame); 

       } 

    } 

は、私はそれがファイルのFPSを変更しない120にCAP_PROP_FPSを設定しようとした場合でも、私は(CAP_PROP_FPS)を取得するとき私はまだ... 59.9を取得し、私は、ビデオの実際を読み

結果は多かれ少なかれ54FPS(UMatを使用していても)です。

より高いFPSレートでファイルを読み取る方法はありますか?

私もOpenCVのQ &ウェブサイト上で、彼の質問をし:http://answers.opencv.org/question/117482/change-fps-on-video-capture-from-file/

は私のコンピュータが遅すぎるという理由だけでそれですか?

+0

インターネットで「ダブルバッファリング」を検索します。これは、別のスレッドがバッファを読み取っているときに、あるスレッドがバッファを書き込んでいる概念です。複数のバッファを使用して速度を調整できます。 –

+0

ファイルから読み込むFPSは、使用するメタデータに過ぎません。'VideoCapture'はできるだけ早くフレームをデコードします。 –

+0

@ThomasMatthewsありがとう私は –

答えて

1

TL; DR FPSが問題とは無関係である、おそらくパフォーマンスの問題FPSが使用され何

ビデオの1つのフレームを表示するには、その前に(HDD、DVD、ネットワーク、インターネットなどから)データを読み取り、デコードする必要があります。これらの操作には、HDD /インターネットの速度、プロセッサの速度などに応じて、システムごとに異なる時間がかかります。各フレームを準備ができたらすぐに表示すると、結果として得られる映画の速度は、システムによって異なります。それは通常は私たちが望むものではないので、ビデオフレームのシーケンスに沿って、「1秒あたりのフレーム数」値(別名FPS)が得られます。 30 FPSの場合は秒、60 FPSの場合は60分の1秒ごとに1回など)フレームが表示される準備ができているが早すぎる場合、時間が来るまで待つことができます。フレームを表示する時間だが、準備が整っていない(不足しすぎているシステムでは)システムがあまりにも多すぎると、できることはあまりありません(場合によってはフレームをドロップする可能性があります)。あなた自身のエフェクトを見るには、x2のFPS値を変更してファイルを保存し、VLCで表示してみてください:同じデータ量と同じフレーム数の場合、ビデオのスピードは倍になり、時間 - 半分。あなたのx2 FPSのために各フレームを2回書いてみてください - あなたは再生速度が正常に戻っていることを見るでしょう(フレーム数の倍と無意味なファイルサイズの増加)。

どのFPSは使用されていませんか?ビデオを処理する(表示しない)場合、元のFPSに制限されず、処理は可能な限り速くなります。あなたのPCが1秒間に1000フレームを処理できるならば、1500ならさらに良い。言うまでもありませんが、ファイル内のFPS値を変更してもCPU/HDDの速度は向上しないため、毎秒54フレームしか処理できない場合は、1秒あたり54フレームしか処理できません。

しかし、VLCはどのように速く表示できますか?時間を測定する前にDebugからReleaseビルドに切り替えることを忘れないと仮定すると、VLCはおそらくビデオ再生の特定のタスクに対して最適化されるでしょう(OpenCVはいくつかのタスクではそれほど高速ではありません(つまり、各フレームをより一般的なMat/UMat構造に変換する必要があります)、マルチスレッド(コメントで言及されているように「ダブルバッファリング」を含む)が考えられます。 HDDを一度に読み込んで処理するのではなく)

関連する問題