【OpenCV】 cvWaitKeyのタイムアウト時間とフレーム更新

ubuntuでOpenCVのプログラムを作る時、ビデオやカメラとかの入力から1フレーム取得して表示してという処理を繰り返すのやけど、その時のcvWaitKeyのタイムアウト時間を1msに設定すると画面更新が行われないっぽい。2ms以上だと(マシンスペックにもよると思うけど)ちゃんと表示された。
どんな感じかと言うと…

int main( void )
{
    CvCapture* capture = cvCreateFileCapture( ファイル名 );
    cvNamedWindow( "VIDEO", CV_WINDOW_AUTOSIZE );
    while( 1 ) {
        IplImage* frame = cvQueryFrame( capture );
        cvShowImage( "VIDEO", frame );
        int key = cvWaitKey( TIMEOUT ) & 0xFF;
        if ( key == 0x1B ) break;
    }
    cvDestroyAllWindows();
    cvReleaseCapture( &capture );
}

ってなコードで、ファイル名で指定した動画ファイルの各フレームを取得しながら、VIDEOというタイトルのwindowに表示できるのやけど、この時、cvWaitKeyのTIMEOUTを2ms以上にしないと描画されない(Windowに何も表示されない)現象が起きる。おそらく描画ルーチンが動くよりもこのタイムアウトが先に発生してメインスレッドがスケジューリングされてしまっているのだと思われる。

ま、一般的に動画であれば30fps辺りやから、ほぼリアルタイムで表示がしたければ TIMEOUT を 33 にしておくと概ね実際の動画と同じように表示されるはず。画像処理とかで一気に結果を確認したい時は2ms〜10ms位にしておけば、マシンパワーにもよるけど一応そのマシンの最高速で処理されるでしょう。

とまぁ、ちょっとだけハマった話から覚え書き。

Author: kan
初めてプログラムらしきものを作ったのは幼稚園の時。それから約40年経ち、現在はデジタル回路設計から信号処理、機械学習まで幅広い経験を活かしてシステムアーキテクトとして活動中。超並列処理、デジタル回路とソフトウェアのバランス設計が得意分野。 Linux/Mac/Windows使い。 C/C++を主要言語として、Unity、Qtなどのフレームワーク興味あり。UI/UXデザイン、STL拡張など。 音声処理、画像処理、技術コンサルは仕事でも請け負います。 一般ソフトウェア開発プロセス、医療機器ソフトウェア開発プロセス作成も進行中。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください