从线程获取相机图像
Posted
技术标签:
【中文标题】从线程获取相机图像【英文标题】:Getting camera image from thread 【发布时间】: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 中创建它并将其传递给线程并使用该线程来捕获帧。
【参考方案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 版本,因为我在旧版本(不记得是哪一个)和 boost 线程中看到了类似的问题。 你能详细说明你使用的版本吗?也可以用 2.4.5 试试。
【讨论】:
我使用 linux 并且没有 osx :(。但是我的同事建议我不要使用 2.4.9,因为它有类似的问题(我会在尝试后确认是否是 linux 的情况) out). 你可以试试 2.4.5 吗? 我已经通过重组项目解决了这个问题 -> 我将 opencv 逻辑放在主线程中,其余的放在辅助线程中:) 无论如何,我会在几天内尝试 2.4.5检查是opencv问题还是其他问题。以上是关于从线程获取相机图像的主要内容,如果未能解决你的问题,请参考以下文章