2011-07-18 15 views
5

OpenCV画像処理の2つのスレッドを同期させるためにセマフォーを使用しようとしています。 1つのスレッドは、Webカメラからフレームをキャプチャし、循環バッファにプッシュし、もう1つのストリームはバッファからイメージをプルして処理します。私はそれらを処理した後に使用するフレームを削除しています。opencvベースの画像処理用のセマフォーベースの同期

バッファを実装するためにブースト循環バッファライブラリを使用しています。

下記のコードをご覧ください。私は初期化の大部分を取り除き、必要なことを強調しました。私が直面している問題は、私がウェブカメラのフレームをストリーミングしてキャプチャできることです。しかし時々窓がちょうど凍る。キャプチャされたフレームが正しく表示されないことがあります。どこが間違っているのか分かりますか?

sem_t semaphore; 

    using namespace cvb; 

    using namespace std; 



    CvCapture* capture = cvCaptureFromCAM(CV_CAP_ANY); 

    IplImage* img0; 

    IplImage* img1; 

    sem_t semaphore; 

    boost::circular_buffer<IplImage*> cb1(200); 

    int ret = sem_init(&semaphore, 1, 10); //Initializing the semaphore 


void* Capture(void* arg){  



     while(1) {   
        sem_wait(&semaphore); 

      img0 = cvQueryFrame(capture);   

      cb1.push_back(img0); 

      cvShowImage("mywindow", img0); 

      sem_post(&semaphore); 


     if ((cvWaitKey(10) & 255) == 27) break; 

       } 



} 

    void* ImageProcessing(void* arg) {  

        while(1) {       


      if(!cb1.empty()) { 
            sem_wait(&semaphore); 
           img2 = cvShowImage("result",img2);      

            cb1.pop_front();   
          sem_post(&semaphore); 
           } 


         if ((cvWaitKey(10) & 255) == 27) break; 

         } 
           cvReleaseCapture(&capture); 

           cvReleaseImage(&img2); 

        } 

答えて

1

CaptureImageProcessingは異なるスレッドで実行されている、そうではありませんか?かつて、異なるスレッドからHighGuiウィンドウを更新しようとしましたが、うまくいかなかったのです。

これは、すべてのウィンドウシステムではないにしても、ほとんどの場合、問題です。異なるスレッドから呼び出してウィンドウを更新することはできません。

cvShowImage呼び出しを同じスレッドに入れてみてください。 cvWaitKeyへのコールは、おそらく同じスレッド内から行う必要があります。

cvNamedWindowを使用してウィンドウを初期化する同じスレッドでcvShowImageを呼び出す必要がある場合があります。しかし、私はこれについては分かりません。

+0

ありがとうございます!あなたの提案が助けになりました!窓はもはや凍結していない。私はそれについてブログに行くよ – Sai

+0

私はそれが助けてうれしいよ:) –

関連する問題