2016-03-31 16 views
2

これまでに見たOpenCVウィンドウを強制的に再描画するためにwaitKey(1)を使用することをお勧めします。それは奇妙であまりにもハッキリに見えます。あなたがする必要がないときにも1ミリ秒待つのはなぜですか?OpenCVでウィンドウを更新するためのwaitKey()の代替方法

代替手段はありますか?私はcv :: updateWindowを試しましたが、OpenGLが必要なようで、クラッシュします。私はWindowsでVC++を使用しています。

+1

ドキュメントによると、それはイベント処理を行う唯一の方法です。コード( 'modules \ highgui \ src \ window_w32.cpp')を見ると、それはかなり簡単なメッセージポンプです。あなた自身の修正バージョンを簡単に書くことができます - キー押下チェックやスリープなどをドロップします。 –

答えて

3

@Dan Masekが言ったように、Windowsメッセージを処理する他の機能はないようです。だから私はVC++のために私自身の小さなDoEvents()関数を書くことになった。以下は、必要な数のフレームをスキップしながら、OpenCVを使用してフレームごとにビデオを表示する完全なソースコードです。

#include <windows.h> 
#include <iostream> 
#include "opencv2/opencv.hpp" 

using namespace cv; 
using namespace std; 
bool DoEvents(); 

int main(int argc, char *argv[]) 
{ 
    VideoCapture cap(argv[1]); 
    if (!cap.isOpened()) 
     return -1; 

    namedWindow("tree", CV_GUI_EXPANDED | CV_WINDOW_AUTOSIZE); 
    double frnb(cap.get(CV_CAP_PROP_FRAME_COUNT)); 
    std::cout << "frame count = " << frnb << endl; 

    for (double fIdx = 0; fIdx < frnb; fIdx += 50) { 
     Mat frame; 
     cap.set(CV_CAP_PROP_POS_FRAMES, fIdx); 
     bool success = cap.read(frame); 
     if (!success) { 
      cout << "Cannot read frame " << endl; 
      break; 
     } 
     imshow("tree", frame); 
     if (!DoEvents()) 
      return 0; 
    } 
    return 0; 
} 

bool DoEvents() 
{ 
    MSG msg; 
    BOOL result; 

    while (::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) 
    { 
     result = ::GetMessage(&msg, NULL, 0, 0); 
     if (result == 0) // WM_QUIT 
     { 
      ::PostQuitMessage(msg.wParam); 
      return false; 
     } 
     else if (result == -1) 
      return true; //error occured 
     else 
     { 
      ::TranslateMessage(&msg); 
      ::DispatchMessage(&msg); 
     } 
    } 

    return true; 
} 
関連する問題