OpenCV 在不同线程上从网络摄像头运行视频

Posted

技术标签:

【中文标题】OpenCV 在不同线程上从网络摄像头运行视频【英文标题】:OpenCV Running Video from WebCam on different thread 【发布时间】:2013-12-04 14:53:36 【问题描述】:

我有 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;

这只是为了让一个网络摄像头转动并进行流式传输。一旦这个工作比其他工作将只是它的副本。

【问题讨论】:

你为什么认为,你需要线程?不一定正确。 你为什么要取消上限? 我重新格式化/编辑了您的代码,正如@ChronoTrigger 在下面注意到的那样,您所要做的就是在return 0; 之前添加pthread_join(thread1, NULL); 【参考方案1】:

当您创建线程时,它开始运行,但是您仍在运行的主程序只是终止,使子线程也完成。尝试在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

【讨论】:

我认为如果两个相机的帧率不同(不同的光照条件或不同的相机),这种方法会导致丢帧。

以上是关于OpenCV 在不同线程上从网络摄像头运行视频的主要内容,如果未能解决你的问题,请参考以下文章

c++ && OpenCV的多线程实时视频传输(TCP on Windows)

OpenCV:来自 VideoWriter 的写入是不是应该在独立线程中运行?

在opencv中使用网络摄像头未显示图像

Opencv/c++ - 在线程中录制实时视频,在另一个线程中处理图像?

使用 opencv 和 pyaudio 从网络摄像头录制视频和音频

OpenCV:使用 cvWriteFrame 从网络摄像头写入视频时出现内存泄漏