2011-07-18 57 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

我很高兴它帮助:) –