基于信号量的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 );
                    }

CaptureImageProcessing正在不同的线程中运行,不是吗?我曾经尝试从不同的线程更新HighGui窗口,但它没有工作。

这实际上是大多数窗口系统的一个问题:你不能从不同的线程调用来更新一个窗口。

试着把两个cvShowImage调用在同一个线程。对cvWaitKey的调用可能也必须从同一线程中进行。

可能cvShowImage必须在使用cvNamedWindow初始化窗口的同一个线程中调用。我不确定这一点。

相关内容

  • 没有找到相关文章

最新更新