【发布时间】:2014-09-29 22:06:53
【问题描述】:
我正在使用 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;
}
【问题讨论】:
-
看起来那个线程根本没有机会运行。
-
几年前我在使用 Qt 和 OpenCV 时遇到过同样的问题。我不确定,但我认为我采用了 C 方法:CvCapture* cvCaptureFromCAM(int device) 并且有效。
-
@Ashalynd 它肯定会运行。我用断点和 cout 仔细检查了它
-
您是否尝试过将
cap声明为全局对象? -
你什么时候执行线程? main 中的循环是无限的无所事事。我还建议您不要使用线程来创建捕获对象。您应该在 main 中创建它并将其传递给线程并使用该线程来捕获帧。
标签: c++ multithreading opencv