2017-11-08 13 views
0

C++の画像処理プログラムでいくつかの関数の実行時間を測定しています。特に、私のUSBカメラでフレームをキャプチャするための実際の実行時間が必要です。測定されたfpsが理論値より高い

問題は、結果がカメラのパラメータと一貫していないように見えるということです。カメラはたいてい30fpsと思われ、フレームを取得するために測定時間が33ms未満になることがあります。私が期待しなければならないと考えられる価値です。例えば、私は12ミリ秒の間隔をたくさん得て、それは実際にはあまりにも少ないようです。 @Revolver_Ocelotは、あなたが他の類似したコールの最後にget_wall_timeの端から費やした時間を測定している、述べたよう

#include <time.h> 
#include <sys/time.h> 

double get_wall_time(){ 
    struct timeval time; 
    if (gettimeofday(&time,NULL)){ 
     // Handle error 
     return 0; 
    } 
    return (double)time.tv_sec + (double)time.tv_usec * .000001; 
} 

int main(){ 
    while (true) { 
     double previoustime = get_wall_time(); 
     this->camera.readFrame(); 
     double currenttime = get_wall_time(); 
     std::cout << currenttime-previoustime << std::endl; 
     // Other stuff 
     // ... 
     // ... 
     usleep(3000); 
    } 
} 
+1

"5分ごとにバスがなければなりませんが、バス停に来ると5分ほど待たなければなりません。バスが到着するまでに1〜2分の遅れがあります" –

+0

'this- > camera.readFrame() '新しいフレームがフェッチされるまでブロックしますか? –

答えて

2

:ここ

はコードです。コードを修正するには、次のようにします。

double currenttime = get_wall_time();  
while (true) { 
    double previoustime = currenttime; 
    this->camera.readFrame(); 
    ... 
    currentime = get_wall_time(); 
} 

違いを見つけることができますか?このコードは、各パス間の間隔を測定します。これは1秒あたりのフレーム数を取得するものです。

カメラを読み取る速度は、新しいフレームを完成させる速度と同じではありません。あなたのカメラは30FPSで録画することができ、15FPSまたは90FPSで読んでいるので、フレームストリームのサブサンプリングまたはオーバーサンプリングが可能です。

オーバーサンプリングできる限度は、画像を読み込んで保存するのに要する時間の1 /時間です。

これは、@ Jacob Hullがブロックで意味するものです。 readFrameが最後のフレームを読み取っただけの場合、新しいフレームまでブロックされず、測定結果と同じ結果が得られます。

+0

あなたの答えをありがとう。私が現在測定しているのは、フレームを読む時間です。私が毎秒のフレームを話すとき、それはあなたが1秒間にフレームを読むことができる回数であると思った。だから多分私はfpsの概念を本当に理解していないかもしれません...しかし、はい、私は処理全体が12ミリ秒以上であることを知っています。 – Trabool

+0

30 FPSよりも速くカメラを読み取っている場合は、ソフトウェアとハ​​ードウェアに応じて同じ画像が複数回表示されます。フレームの読み取りは、フルフレームの時間を過ぎることは想定されていません。カメラの場合、1/fps秒ごとに送信するように画像が構築されます。それと同期するには、使用しているライブラリのドキュメントを参照する必要がありますが、最も単純な形式で、同じ速度でイメージを読み込むだけです。 –

関連する問題