我正在使用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;
}
答案 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。