Sai*_*Sai 5 multithreading synchronization boost opencv semaphore
我正在尝试使用信号量来同步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 );
}
Run Code Online (Sandbox Code Playgroud)
Capture并且ImageProcessing在不同的线程中运行,不是吗?我曾经尝试从不同的线程更新 HighGui 窗口,但没有成功。
这实际上是大多数(如果不是全部)窗口系统的问题:您无法从不同线程进行调用来更新窗口。
尝试将两个cvShowImage调用放在同一个线程中。调用cvWaitKey可能也必须从同一线程内进行。
可能是这样的情况,cvShowImage必须在使用 初始化窗口的同一线程中调用cvNamedWindow。不过我对此并不确定。
| 归档时间: |
|
| 查看次数: |
1555 次 |
| 最近记录: |