Проблема с доступом к камере при использовании потока Boost в OSX

Я пытаюсь использовать 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()», но камера никогда не включается, и нет сообщения «Очистка камеры».

Есть ли способ исправить это?

Спасибо!


person okintheory    schedule 04.03.2011    source источник
comment
iirc Для функций камеры OpenCV на Mac требуется доступ к target-c NSRunLoop; не знаю, как добраться до одного из новой темы.   -  person James    schedule 08.03.2011
comment
Как это работает? Могу ли я передать какой-либо дескриптор при создании потока?   -  person okintheory    schedule 12.03.2011
comment
Я не знаю. Я думаю, проблема в том, что NSRunLoop использует локальное хранилище потока, поэтому вам нужно создать новый для каждого потока, который будет использовать фреймворки, зависящие от него, для обработки событий.   -  person James    schedule 12.03.2011
comment
Хорошо спасибо. Я посмотрю на это.   -  person okintheory    schedule 12.03.2011


Ответы (1)


Я не часто использую boost, но разве вам не нужно что-то делать, чтобы main() не завершался, пока ваш поток работает? Вроде может...

int main() {
    boost::thread trackerThread( boost::bind(openCamera) );
    trackerThread.join();
}
person bob2    schedule 12.05.2011
comment
+1 Точно. Поток создается, и main() возвращается, уничтожая вновь созданный поток. Хорошо подмечено. - person karlphillip; 12.05.2011