gpt4 book ai didi

multithreading - 用于基于 opencv 的图像处理的基于信号量的同步

转载 作者:太空宇宙 更新时间:2023-11-03 20:55:15 24 4
gpt4 key购买 nike

我正在尝试使用信号量来同步 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 );

}

最佳答案

CaptureImageProcessing 正在不同的线程中运行,不是吗?我曾尝试从不同的线程更新 HighGui 窗口,但没有成功。

这实际上是大多数(如果不是全部)窗口系统的问题:您不能从不同的线程调用来更新窗口。

尝试将两个 cvShowImage 调用放在同一个线程中。对 cvWaitKey 的调用可能也必须在同一线程内进行。

cvShowImage 可能必须在使用 cvNamedWindow 初始化窗口的同一线程中调用。不过,我不确定这一点。

关于multithreading - 用于基于 opencv 的图像处理的基于信号量的同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6739031/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com