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