Я пытаюсь использовать 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;
}
}
Это не удается при открытии самой камеры, что довольно странно. Какие-либо предложения?
Насколько я знаю, поток не может возвращать результаты, так что вам нужно передать cap по ссылке, иначе лучше, если вы используете future, использование future с потоками поможет вам вернуть результаты из функции.
Вместо использования потоков используйте async, который лучше подходит для потоков.
Других решений пока нет …