7

に問題がありcv::imshowます。通常、画像サイズに対して約 1 ~ 2 ミリ秒の処理時間を消費しますが、処理パイプラインのある時点で、同じ種類の画像に対して 4 ~ 8 ミリ秒を使用します。

方法があります

void Tool::displayImage()
{
   startTimeMeasure();
   cv::imshow("output",image);
   evaluateTimeMeasure();
}

imageメンバー変数であり、highgui ウィンドウは別の場所に作成されます。時間計測は と で動作しboost::posix_time ptimeますtime_duration

cvStartWindowThread();

と呼ばれていました。

ポイントは、displayImage()複雑な処理チェーン (ビデオファイルからの画像の読み込み、前処理など) 内で呼び出されるcv::imshowと非常に遅くなるのに対して、更新された画像を再描画するための「一時停止」ビデオでの呼び出しは非常に高速であるということです。

cv::waitKey(10)時間計測開始前にa を追加すると、cv::imshow速度も速くなります。それで、どのブロックを処理しなければならない(gui?)ものがいくつかあるかもしれませんかcv::imshowcv::waitKey(40)ループ内の別のスレッドで呼び出され、キーボード入力がビデオを制御 (一時停止/再開など) するのを待ちます。私の知る限り、時間cv::imshow内に処理されるある種のキューで実行されますcv::waitKeyか?!? その時間帯に実行されるすべてのタスクに関する情報はどこにありますか? たぶん、コードの一部 (今では非常に複雑) を再配置して、imshow常に高速化できるようにすることができます。

では、通話では何が起こるのcv::imshowでしょうか? また、異なる状況で同じ通話の実行が遅い/速い理由は何でしょうか?

編集:通常の実行と「一時停止」モードでの処理の間に認識された1つの違いは、一時停止モードではメソッドがバインドされたマウスコールバック関数( windowThread?内から)から開始され、通常モードではメイン処理スレッドから開始されることです。 .

4

1 に答える 1

3

これは OpenGL の典型的な問題であり、OpenCV ウィンドウは OpenGL を使用して作成できます。( SDL_GL_SwapBuffers()が断続的に遅いSwapBuffersなどを参照)には問題があり、その前に小さなスリープを追加することで解決されることがよくあります。

  • ビデオ ドライバーで垂直同期を無効にすると、問題が解決する場合があります。
  • あまり多くの画像ウィンドウを開かないようにすること (多くの OpenCV プログラムの典型的な問題) が役立ちます。
  • OpenGL とは異なる API を使用してウィンドウを作成すると役立つ場合があります (再コンパイルが必要になる可能性がありますhighgui)。
于 2014-10-18T15:09:42.553 に答える