2011-07-18 16 views
5

Estoy tratando de usar semáforos para sincronizar dos subprocesos de los procesos de imagen de OpenCV. Un hilo sigue capturando cuadros de la cámara web y lo empuja a un búfer circular y el otro flujo extrae una imagen del búfer y los procesa. Estoy borrando el marco que uso después de procesarlos.Sincronización basada en semáforo para el procesamiento de imágenes basado en opencv

Estoy usando las bibliotecas de buffers circulares boost para implementar el buffer.

Encuentra el fragmento de código exacto a continuación. He eliminado la mayor parte de la inicialización y resalto que es necesario. El problema que estoy enfrentando es que puedo transmitir y capturar los marcos de mi webcam. Pero la ventana simplemente se congela después de algunas veces. En algunas ocasiones, los cuadros capturados no se muestran correctamente. ¿Puedo saber dónde me estoy equivocando?

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); 

        } 

Respuesta

1

Capture y ImageProcessing están en ejecución en diferentes hilos, ¿verdad? Una vez intenté actualizar las ventanas de HighGui desde diferentes subprocesos, pero no funcionó.

Esto es realmente un problema con la mayoría, si no con todos los sistemas de ventanas: no puede hacer llamadas desde diferentes hilos para actualizar una ventana.

Intente poner ambas llamadas cvShowImage en el mismo hilo. Es probable que las llamadas al cvWaitKey tengan que realizarse desde dentro del mismo hilo.

Puede ser que se llame a cvShowImage en el mismo hilo en el que inicializa las ventanas usando cvNamedWindow. Aunque no estoy seguro de esto.

+0

Gracias! Tu sugerencia ayudó! La ventana ya no se congela. Voy a blog sobre eso – Sai

+0

Me alegra que haya ayudado :) –

Cuestiones relacionadas