Multithreading 基于信号量的opencv图像处理同步

Multithreading 基于信号量的opencv图像处理同步,multithreading,boost,opencv,synchronization,semaphore,Multithreading,Boost,Opencv,Synchronization,Semaphore,我试图使用信号量来同步OpenCV映像进程的两个线程。一个线程不断从网络摄像头捕获帧并将其推入循环缓冲区,另一个线程从缓冲区提取图像并对其进行处理。我正在删除处理后使用的帧 我正在使用boost循环缓冲库来实现缓冲区 请在下面找到确切的代码片段。我已经消除了大部分必要的初始化和突出显示。我面临的问题是,我能够流式传输和捕获我的网络摄像头的帧。但是有时候窗户会结冰。在某些情况下,捕获的帧无法正确显示。我能知道我哪里出了问题吗 sem_t semaphore; using namesp

我试图使用信号量来同步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 );

                    }
sem\t信号量;
使用名称空间cvb;
使用名称空间std;
CvCapture*capture=cvCaptureFromCAM(CV\u CAP\u ANY);
IplImage*img0;
IplImage*img1;
信号量;
boost::循环缓冲区cb1(200);
int-ret=sem_init(&信号量,1,10)//初始化信号量
void*Capture(void*arg){
而第(1)款{
sem_等待(和信号量);
img0=cvQueryFrame(捕获);
cb1.推回(img0);
cvShowImage(“我的窗口”,img0);
sem_post(和信号灯);
如果((cvWaitKey(10)&255)==27)中断;
} 
}
void*ImageProcessing(void*arg){
而第(1)款{
如果(!cb1.empty()){
sem_等待(和信号量);
img2=cvShowImage(“结果”,img2);
cb1.pop_front();
sem_post(和信号灯);
}
如果((cvWaitKey(10)&255)==27)中断;
}   
cvReleaseCapture(&capture);
cvReleaseImage(&img2);
}

Capture
ImageProcessing
正在不同的线程中运行,不是吗?我曾经尝试从不同的线程更新HighGui窗口,但没有成功

这实际上是大多数(如果不是所有的话)窗口系统的一个问题:您不能从不同的线程调用来更新窗口

尝试将两个
cvShowImage
调用放在同一个线程中。对
cvWaitKey
的调用可能也必须在同一线程中进行


在这种情况下,必须在使用
cvNamedWindow
初始化窗口的同一线程中调用
cvShowImage
。不过,我不太确定。

谢谢!你的建议有帮助!窗户不再结冰了。我打算写一篇关于它的博客