【发布时间】:2011-07-09 03:03:39
【问题描述】:
我正在尝试使用 OpenCV 打开相机。当我在主线程中打开相机时,这可以正常工作,但是当我尝试在 Boost 线程中打开相机时,它会失败。我一直无法谷歌为什么会发生这种情况。我认为这与 Boost 线程的权限有关。
以下工作正常:
#include <cv.h>
#include <boost/thread.hpp>
#include <highgui.h>
using namespace cv;
void openCamera() {
Ptr< VideoCapture > capPtr(new VideoCapture(0)); // open the default camera
}
int main() {
openCamera();
}
我的相机会短暂打开,之后我会收到预期的“已清理相机”消息。
但是当我通过 Boost 线程尝试相同的操作时,它并没有打开相机:
#include <cv.h>
#include <boost/thread.hpp>
#include <highgui.h>
#include <iostream>
using namespace cv;
void openCamera() {
std::cout << "confirming that openCamera() was called" << std::endl;
Ptr< VideoCapture > capPtr(new VideoCapture(0)); // open the default camera
}
int main() {
boost::thread trackerThread( boost::bind(openCamera) );
}
这会打印“确认调用了 openCamera()”,但相机永远不会打开,并且没有“已清理相机”消息。
有什么办法可以解决吗?
谢谢!
【问题讨论】:
-
iirc mac上的OpenCV Camera函数需要访问objective-c
NSRunLoop;虽然不知道如何从新线程中获得一个。 -
它是如何工作的?我可以在创建线程时传递某种句柄吗?
-
我不知道。我认为问题在于 NSRunLoop 使用线程本地存储——因此您需要为每个线程创建一个新的,该线程将使用依赖于它的框架来处理事件。
-
好的,谢谢。我会调查的。
标签: c++ opencv osx-snow-leopard boost-thread