【问题标题】:Problem accessing camera when using Boost thread on OSX在 OSX 上使用 Boost 线程时访问相机时出现问题
【发布时间】: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


【解决方案1】:

我不经常使用 boost,但是你不需要做一些事情来防止 main() 在你的线程工作时退出吗?或许……

int main() {
    boost::thread trackerThread( boost::bind(openCamera) );
    trackerThread.join();
}

【讨论】:

  • +1 没错。正在创建线程并且 main() 正在返回破坏新创建的线程。很好发现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
  • 2010-10-03
  • 2015-12-01
相关资源
最近更新 更多