Отключение устройства videoInput при пробуждении другого потока - PullRequest
0 голосов
/ 09 сентября 2018

Я использую библиотеку videoInput для приложения, которое отслеживает положение устройства с использованием нескольких камер. Используя его, я достиг идеального извлечения точек из входного изображения, но он перестал работать, когда я переместил код в несколько потоков.

Всякий раз, когда основной поток просыпается потоком видеозахвата через условную переменную, объект-член объекта, на котором выполняется поток видеозахвата, кажется, разрушается, даже если ссылка не теряется в процессе просыпается другая нить.

Основной поток создает потоки захвата и обрабатывает кадры, переданные через вектор. Это инициализация, которая происходит в основном потоке:

videoInput::setComMultiThreaded(true);
videoInput::listDevices(true);

В потоке захвата для объекта-члена выполняется следующий код videoInput cap

cap.setupDevice(deviceId, width, height);
cap.setAutoReconnectOnFreeze(deviceId, true, 1);

И затем следующий код выполняется в цикле.

unsigned char* frame = new unsigned char[width * height * 3]();
cap.isFrameNew(capId);
cap.getPixels(capId, frame, false, true);

Он работает так, как задумано, но как только данные передаются в основной поток, основной поток уведомляется о данных и пробуждается с помощью условной переменной, устройство отключается (что происходит только в объекте videoInput). деконструктор), что приводит к исключению на следующей итерации цикла. Я получил последний исходный код, скомпилированный в статическую библиотеку x64.

Мне абсолютно необходимо, чтобы приложение было многопоточным. Есть ли что-то важное, чего мне не хватает для этой работы, или я просто столкнулся с некоторыми ограничениями этой библиотеки и мне нужно использовать что-то еще / сделать свою собственную оболочку DirectShow?

Я уже пробовал OpenCV и раньше, и он просто не справляется со мной (множество проблем, слишком много имен и слишком много глупых обходных путей). Мне не нужно, чтобы это приложение было кроссплатформенным, я нацеливаюсь только на Windows 64-bit.

1 Ответ

0 голосов
/ 16 сентября 2018

Я решил эту проблему, изменив videoInput cap на указатель и присвоив ему объект videoInput в конструкторе.

...