2011-07-18 22 views
5

我正在嘗試使用信號量來同步兩個OpenCV圖像處理線程。一個線程不斷捕獲網絡攝像頭的幀並將其推入循環緩衝區,另一個線程從緩衝區中提取圖像並處理它們。我在處理它們之後刪除了我使用的框架。基於信號量的基於opencv的圖像處理同步

我正在使用boost循環緩衝區庫來實現緩衝區。

請在下面找到具體的代碼段。我已經消除了大部分的初始化並強調了必要的。我面臨的問題是我能夠流式傳輸並捕獲我的攝像頭的幀。但有時窗口會凍結。在某些情況下,捕獲的幀不能正確顯示。我可以知道我哪裏錯了嗎?

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可能必須在同一個線程內進行。

可能是這樣的情況,cvShowImage必須在您使用cvNamedWindow初始化窗口的同一線程中調用。不過,我不確定這一點。

+0

謝謝!你的建議有幫助!窗戶不再凍結。我要去博客關於它 – Sai

+0

我很高興它幫助:) –