从线程获取相机图像

时间:2014-09-29 22:06:53

标签: c++ multithreading opencv

我正在使用opencv库从内置网络摄像头获取视频。当我将相机逻辑代码放入主函数时,下面的代码非常有效,但是当我将它放入单独的线程时它不会。 task1()帖子在cv::VideoCapture capture(0)处停止。同时,task2()和主线程都正确执行。

有人可以解释为什么opencv逻辑在放入单独的线程时不起作用吗?

我的代码:

#include <iostream>
#include <string.h>
#include <thread>
#include <unistd.h>
#include <opencv2/opencv.hpp>

using namespace std;

void task1 (){
            cout<<"1st thread ";
            cv::Mat frame;
            cv::VideoCapture capture(0);
            if ( capture.isOpened() == false )
            {
                cout<<"Failed to open camera";
            }

            cv::namedWindow("Test OpenCV",1);


            while ( true ){
                capture >> frame;
                cv::imshow("Test OpenCV", frame );
                int key = cv::waitKey(1);
                if ( key == 27 )
                    break;
            }

        }

        void task2 (){
            int n = 0;
            while (1){
                cout<<"2nd thread "<<n<<"\n";
                sleep(3);
                n++;
            }
        }

        int main(int argc, const char * argv[]) {
            // insert code here...
            cout << "Hello, World!\n";
            thread t1(task1);
            thread t2(task2);
            //t1.join();
            //t2.join();
            int n = 0;
            while (1){
                cout<<"main thread "<<n<<"\n";
                sleep(1);
                n++;
            }  
            return 0;
        }

1 个答案:

答案 0 :(得分:1)

您的代码运行应该为我(没有任何修改),我通过task1线程(使用OpenCV 2.4.5)获得实时源。 我为编译器支持添加了-std=gnu++0x标志(否则g ++会抛出错误)。

g++ -std=gnu++0x opencv_thread.cpp -o opencv_thread `pkg-config --cflags --libs opencv`

检查我的控制台输出here。我在task1中的while循环中添加了cout << "1st thread "<< endl;

我认为这个问题可能特定于某些opencv版本,因为我在旧版本中看到了类似的问题(不记得哪一个)并且提升了线程。 你能详细说明你使用的版本吗?也请尝试使用2.4.5。