Можно ли использовать cv2.Videocapture для доступа к видеоустройствам с индексом больше 7 в Ubuntu 18.04?

В настоящее время пытается одновременно захватить 10 изображений с 10 USB-камер, подключенных к Raspberry Pi 4 (через USB-порты платы и USB-концентратор) с установленной Ubuntu 18.04. Я использую многопоточный подход для создания нескольких объектов камеры, которые будут снимать фотографии. В настоящее время он работает с 4 камерами (доходит до /dev/video7, при этом каждая физическая камера занимает 2 указателя устройства.

Проблема, с которой я сталкиваюсь в настоящее время, заключается в доступе к любому устройству камеры с индексом больше 7 (физическая камера 5 или выше не будет доступна). В настоящее время я получаю следующую ошибку:

ВИДЕО ОШИБКА: V4L: индекс 8 неверен!

который связан с исходным файлом opencv_3.4.1, расположенным в modules/videoio/src/cap_v4l.cpp. В этом исходном файле упоминается, что он был протестирован до 8 входов, кому-нибудь удалось получить более 8 устройств ввода для захвата фотографий с помощью Raspberry Pi?

Я также добавлю немного отладочной информации, которую я уже пробовал.

  • Изменено #define MAX_CAMERAS 8 (находится в cap_v4l.cpp) на большее значение и перестроен модуль opencv, однако это не повлияло.
  • Я также пытался просто получить доступ к любой камере с индексом устройства, превышающим 7, и он все еще сохраняется.
  • Мне удалось получить доступ к этим камерам с помощью usb_cam на ROS melodic, поэтому они работают и подключаются правильно. Я бы предпочел, чтобы это работало через opencv-python, если это возможно, но если решения не возникнет, я изучу подход ROS для решения задачи.

Любая помощь или совет приветствуется, спасибо.


person Asherk03    schedule 29.01.2021    source источник


Ответы (1)


После бесконечной отладки я нашел обходной метод, который позволяет мне захватывать изображения с камерой с индексом выше 7. После создания объекта VideoCapture() в первой строке кода ниже это приводит к тому, что ошибка VIDEOIO ERROR все еще возникает. После этого я проверяю, правильно ли была открыта камера, и если нет, я снова открываю камеру, которая затем работает.

    self.cam = cv2.VideoCapture(camID)
    if(self.cam.isOpened() is False):
        self.cam.open("/dev/video" + str(camID))
person Asherk03    schedule 30.01.2021