OpenCV Python: cv2.VideoCapture может найти только 2 из 3 камер, приложение Windows Camera находит все

Я пытаюсь создать 3 кадры захвата в реальном времени с веб-камерами в USB-концентратор в свой ноутбук. Используя приложение "камера" в Windows, я могу изменить источник камеры по одному и подтвердить, что все 3 веб-камеры работают. Однако мой код OpenCV Python может найти только два.

(Быстрые примечания на USB - это USB 3.0-концентратор, порт для ноутбука - USB 3, и у меня даже есть активный кабель USB-to-male, идущий в ноутбук, поэтому, учитывая это и приложение Windows, я, как правило, доверяю аппаратное обеспечение.)

Ниже я провел некоторое сырое тестирование cv2.VideoCapture(src) с приведенными ниже результатами:

cams_test = 10
for i in range(0, cams_test):
    cap = cv2.VideoCapture(i)
    test, frame = cap.read()
    print("i : "+str(i)+" /// result: "+str(test))

Этот первый аргумент, test, возвращает True/False в зависимости от того, можно ли считать кадр. Результаты:

i : 0 /// result: True
i : 1 /// result: True
i : 2 /// result: False
i : 3 /// result: False
i : 4 /// result: False
i : 5 /// result: False
i : 6 /// result: False
i : 7 /// result: False
i : 8 /// result: False
i : 9 /// result: False

Как и в случае с другим примером кода, который я тестировал, можно зарегистрировать только 2 веб-камеры и показать кадры в Python. И приложение для камеры Windows 10 позволяет мне прокручивать все 3 рабочих и связанных веб-камеры.

Я знаю, что могу создать несколько, например 3+, cv2.imshow() кадров, если я использую cap которая работает. Мой проект включает в себя выполнение этого, чтобы показать в реальном времени USB-камеры веб-камеры на ноутбуке с нескольких камер.

Любая помощь и советы оцениваются; также потенциально заинтересованы в альтернативных решениях на основе Python. Приветствия.

Ответ 1

Поддерживаются ли ваши веб-камеры USB3? Основываясь на моем практическом опыте работы с веб-камерами и OpenCV, большинство обычных камер только передают по стандарту USB2, 480 Мбит/с. Точные сведения о том, сколько камер вы можете поддерживать на одном канале USB, зависят от технологии разрешения, частоты кадров и сжатия видео. По моему опыту, с цветным видео 1080p со скоростью 30 кадров в секунду и кодировкой H.264, только один поток камеры подходит для одного USB-контроллера.

Легкий тест, чтобы увидеть, ограничена ли пропускная способность, будет изменение вашей программы, чтобы явно закрыть каждый поток после его проверки (cap.release()), чтобы ваша тестовая программа открывала только одну камеру за раз, например, камеру Windows приложение. Если это сработает, тогда вы вполне можете взглянуть на ограничение пропускной способности.

При отладке проблем с захватом видео в Windows также может быть полезно открыть потоки камеры с помощью VLC. VLC может перечислить все камеры, доступные из DirectShow, который является тем же API, что и OpenCV VideoCapture по умолчанию. Вы также можете запускать несколько экземпляров VLC для одновременной работы потоков.

Если вы нажмете "Дополнительные параметры", а затем отметьте "Свойства устройства", VLC покажет, какие настройки (экспозиция, фокус и т.д.) Можно настроить с помощью DirectShow. Эти настройки обычно доступны в OpenCV через VideoCapture.set().

Ответ 2

1) о cv2... Ну, есть ли другие примеры/альтернативы? возможно, что третья камера привязана к другому экземпляру вместо cv2?

2) Вы пытались запустить цикл (диапазон) из -1 вместо 0?

3) Если ни один из методов не поможет вам, я советую перейти в Device Manager и временно отключить отдельную веб-камеру, а затем снова запустить сценарий и посмотреть, какие изменения. После этого веб-камеру ENABLE и посмотрите, что изменилось. (в худшем случае вместо ENABLE/DISABLE вы можете заблокировать/переустановить конкретную веб-камеру, а затем окна смогут их правильно разрешить).

Ответ 3

с двумя устройствами видеовхода автоматически не означает, что их идентификаторы равны 0 и 10. Попробуйте получить доступ ко всем камерам, увеличившись примерно до 500 или более вместо 10

cams_test = 500
for i in range(0, cams_test):
    cap = cv2.VideoCapture(i)
    test, frame = cap.read()
    if test:
        print("i : "+str(i)+" /// result: "+str(test))

Я думаю, вы только тестируете

Ответ 4

Во-первых, мы должны проверить, что ваша веб-камера может или не может быть подключена к OPENCV.

подключите только одну веб-камеру и запустите свою программу с помощью cv2.VideoCapture(0) Параметр 0 означает, что подключена одна камера. если вся ваша веб-камера в порядке, то это будет проблема индекса, есть код, который найдет идентификатор устройства, назначенный кулачке.

и если какая-то веб-камера, к сожалению, терпит неудачу, тогда это будет сложно.

В этом случае вы должны создать свою собственную функцию, которая захватывает использование SDK и записывает изображение в cv :: Mat.