OpenCV — захват кадров в отдельном потоке

Я пытаюсь использовать OpenCV 2.4.8 для захвата кадров в моем приложении для Android. Я пишу для этого библиотеку .SO и связываю с ней библиотеки OpenCV.

По этой ссылке: http://docs.opencv.org/modules/core/doc/intro.html, Я написал пример кода, как показано ниже.

int main() {
VideoCapture cap(0);
if(!cap.isOpened()) return -1;
capture(cap);
}

void capture(VideoCapture cap) {
for(int i = 0; i<= 3; i++)
{
cap >> frame;
}
}

Этот код прекрасно работает, пока я запускаю его из основного потока. Если я попытаюсь запустить его в отдельном потоке, например

std::thread t(capture, cap);

Он не может захватить кадры. Это дает мне фатальную ошибку в строке кода

cap>> frame;

в приведенном выше коде. Однако в приведенной выше документации OpenCV четко сказано: «Текущая реализация OpenCV полностью повторно вводится. То есть одна и та же функция, один и тот же постоянный метод экземпляра класса или один и тот же непостоянный метод разных экземпляров класса могут вызываться из разных потоков. Кроме того, один и тот же cv :: Mat может использоваться в разных потоках, потому что в операциях подсчета ссылок используются специфические для архитектуры атомарные инструкции. «

Есть идеи, что мне здесь не хватает?

РЕДАКТИРОВАТЬ:

Я попытался открыть камеру в потоке и изменил capture (), как показано ниже:

void capture() {
VideoCapture cap(0); // fails here
if(!cap.isOpened()) return -1;
for(int i=0; i <= 3; i++) {
cap >> frame;
}
}

Это не удается при открытии самой камеры, что довольно странно. Какие-либо предложения?

0

Решение

Насколько я знаю, поток не может возвращать результаты, так что вам нужно передать cap по ссылке, иначе лучше, если вы используете future, использование future с потоками поможет вам вернуть результаты из функции.
Вместо использования потоков используйте async, который лучше подходит для потоков.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]