OpenCV在不同的线程上运行来自WebCam的视频

时间:2013-12-04 14:53:36

标签: c++ multithreading opencv pthreads

我有2个网络摄像头,我希望同时获得两个网络摄像头的输入。因此我相信我必须使用c ++中的线程来处理pthread。当我运行下面给出的代码时,网络摄像头会打开一秒钟并退出例程。我无法弄清楚我的代码中有什么问题。

void *WebCam(void *arg){

    VideoCapture cap(0);
    for (; ; ) {
        Mat frame;
        *cap >> frame;
        resize(frame, frame, Size(640, 480));
        flip(frame, frame, 1);

        imshow("frame", frame);

        if(waitKey(30) >= 0)
            break;
    }
    pthread_exit(NULL);   
}

int main(){
    pthread_t thread1, thread2;
    pthread_create(&thread1, NULL, &WebCam, NULL);
    return 0;
}

这对于一个网络摄像头来说就是转身和做流媒体。一旦这个工作比其他工作只是复制它。

1 个答案:

答案 0 :(得分:3)

当你创建线程时,它开始运行,但你的主程序仍在运行,只是终止,使得子线程完成。尝试在pthread_create之后添加此内容:

pthread_join(thread1, NULL);

顺便说一下,即使你有两个摄像头,也可以避免使用线程。我不确定,但在处理highgui函数(imshowwaitKey)时它们可能会有问题,因为您必须确保它们是线程安全的。否则,两个线程同时调用waitKey的结果是什么? 你可以摆脱类似于这个设计的线程:

VideoCapture cap0(0);
VideoCapture cap1(1);

for(;;)
{
  cv::Mat im[2];
  cap0 >> im[0];
  cap1 >> im[1];

  // check which of im[i] is non empty and do something with it
}