2012-02-20 3 views
0

ブーストで作成されたスレッドではなく、cvQueryFrame(opencvでウェブカメラからフレームを取得する)に電話する必要があります。ここでは少しのコード例は次のとおりです。cvQueryFrameとboost :: threadを一緒に使用する

void testCVfunc(){ 
    IplImage* frame; 
    CvCapture *capture; 
    capture = cvCreateCameraCapture(CV_CAP_ANY); 
    if(!capture){ 
     exit(1); 
    } 
    frame = cvQueryFrame(capture); 
    cvNamedWindow("testCV", 1); 

    while(frame = cvQueryFrame(capture)){ 
     if(!frame){ 
      exit(2); 
     } 
     cvShowImage("testCV", frame); 
     cvWaitKey(1); 
    } 
    cvReleaseImage(&frame); 
    cvReleaseCapture(&capture); 
} 

int main(){ 
    //Method 1: without boost::thread, works fine 
    testCVfunc(); 

    //Method 2: with boost::thread, show black screen 
    char entree; 
    boost::thread threadTestCV = boost::thread(&testCVfunc); 
    std::cin >> entree; 
} 

コメントが言うように、私はboost::threadからそれを呼び出すことはありませんが、私はboost::threadを使用している場合、私は黒い画面を取得する場合testCVfuncはその仕事をしていません。 私は問題を起こさない、多分誰かがしますか?

ありがとうございました。

答えて

0

OpenCVがセカンダリスレッドから実行されているときにいくつかの問題が発生しました。すべてのプラットフォームで動作が一貫していない場合、問題の原因を特定するのは難しいです。

たとえば、のソースコードは、Mac OS X 10.7.2のOpenCV 2.3.0で完全に機能しました。どのプラットフォームを使用しているのかわかりませんが、自分のコンピュータで動作しているということは、使用しているプラ​​ットフォームでOpenCVに実装上の問題があることを示しています。

OpenCVのコードをプライマリスレッドに移動できない場合は、OpenCV関連のすべてのタスクを処理する2番目のプログラムを作成し、このプログラムに主なアプリケーションと通信します。

+0

cvNamedWindow()は問題ではなく、別のスレッドからOpenCVを実行しようとしているので、2番目の提案は本当に助けになりません(私の完全なプログラムは2番目のスレッドから実行される別のライブラリを使用します)。とにかく、ありがとう、別の考えですか? openCVがスレッドを担当しないのはなぜですか? – Crumble

+0

どのようなシステムですか?勝つ? Linux?マック?どのようなopencvのバージョンを使用していますか? – karlphillip

+0

申し訳ありませんが、そのような基本情報を言うのを忘れました。私はWindows 7で、opencv 2.3を使用しています。 – Crumble

0

私はそれが本当に質問に答えるしない場合であっても、メインスレッドで

cvCreateCameraCapture(CV_CAP_ANY); 

を呼び出すことによって、問題を解決:

なぜこれが動作しませんの?質問。

これは他の人に役立つことを望みます。

0

cv :: startWindowThread();を呼び出してみてください。あなたのスレッド内にウィンドウを作成します。これは私のために働いた。

関連する問題