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);
}
Gracias! Tu sugerencia ayudó! La ventana ya no se congela. Voy a blog sobre eso – Sai
Me alegra que haya ayudado :) –