Семафорная синхронизация для обработки изображений на основе opencv - PullRequest
5 голосов
/ 19 июля 2011

Я пытаюсь использовать семафоры для синхронизации двух потоков процессов обработки изображений 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 Ответ

1 голос
/ 19 июля 2011

Capture и ImageProcessing запускаются в разных потоках, не так ли? Однажды я пытался обновить окна HighGui из разных потоков, но это не сработало.

На самом деле это проблема большинства, если не всех оконных систем: вы не можете звонить из разных потоков, чтобы обновить окно.

Попробуйте поместить оба вызова cvShowImage в один поток. Вызовы cvWaitKey, вероятно, должны быть сделаны из того же потока.

Может случиться так, что cvShowImage должен вызываться в том же потоке, в котором вы инициализируете окна, используя cvNamedWindow. Хотя я не уверен в этом.

...