5
我正在尝试使用信号量来同步两个OpenCV图像处理线程。一个线程不断捕获网络摄像头的帧并将其推入循环缓冲区,另一个线程从缓冲区中提取图像并处理它们。我在处理它们之后删除了我使用的框架。基于信号量的基于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);
}
谢谢!你的建议有帮助!窗户不再冻结。我要去博客关于它 – Sai
我很高兴它帮助:) –