2012年10月1日月曜日

OpenCVでVGAサイズの画像を30fpsで2枚リアルタイムに表示する


カメラからの入力画像と処理結果の画像の2枚を、VGAサイズでリアルタイム(30fps)に表示しようと試みたが、なぜか片方の表示がたまにつまった状態になった

オリジナルプログラムの抜粋

while(true) {
  cap >> mat;
  cv::imshow("org,mat);

  cv::Mat res = hoge(mat);
  cv::imshow("hoge",res);

  cv::waitKey(10);
}

CPUの負荷は25%ぐらいで余裕のはずである。


いくつか要因を考え試行錯誤を試みた結果、

  cv::waitKey(30);

に変更することで表示されるようになったと思われる。
30は、暫定値であり、下記に示すように本来まじめに考える必要がある。


どうやらwaitKeyの時間で、フレームバッファに書き込みをしており、この時間が短いためつまった状態(こま落ちした)になったと推測される。


30fpsを確保するには、1フレームの処理時間(while内の処理)を33msec内にする必要がある。

理想は、画像処理の時間+waitKey = 33msecであるが、この値が小さくても、OpenCVのカメラ入力処理で30fpsに調整されるため表示がおかしくなることはなさそうである

一方大きい場合は、たとえば、waitKey(500)で試してみると、極端なこま落ち状態になった。

以上

0 件のコメント:

コメントを投稿