Недавно я столкнулся с необходимостью определения, какое устройство (имя устройства) связано с каким источником ввода (индекс устройства) для OpenCV VideoCapture () для моего проекта.
Поскольку я использую порт Python OpenCV (v3.3.0.10 в соответствии с PyCharm), существуют различные бэкэнд-функции, которые, исходя из моих исследований, очевидно, недоступны для моих манипуляций с Python.
Находясь на Windows 10 Home 64-bit и используя Python 3.6.3, я столкнулся с этим удобная работа сделано Сяо Лин, который создает специальное расширение Python2 для моих нужд. После шелест с Файл C ++ используя Python3 документация сделать это Совместимый с Python3, он успешно скомпилирован. Затем я провел тест, и он сработал, как я ожидал.
Из чистого любопытства и наличия Python 2.7.14 под рукой (Примечание: OpenCV v3.3.0.10 также установлен для моего Python2 — в соответствии с PyCharm), Я пошел дальше и скомпилировал то же расширение C ++ для Python2, используя тот же setup.py. Успешно скомпилирован, потом я запустил такой же test.py …но получил разные результаты.
Когда я запускаю test.py для Python 3, результаты (правильно) выглядят следующим образом:
Примечание: я остановил код во время выполнения, пока он ждал пользовательского ввода.
OpenCV version: 3.3.0
0: DroidCam Source 3
1: Integrated Webcam
Select a camera (0 to 1):
Process finished with exit code 1
И результаты для Python2 … также «правильные»:
OpenCV version: 3.3.0
0: DroidCam Source 3
1: Integrated Webcam
2: DroidCam Source 1
3: DroidCam Source 2
4: DroidCam Source Mini (240p)
Select a camera (0 to 4):
Process finished with exit code 1
Моя камера настроена на моем ноутбуке следующим образом:
Примечание. DroidCamX имеет настольное приложение, которое работает вместе с приложением Android DroidCamX.
Примечание 2: Я использую DroidCamX через (физическое / проводное) соединение USB.
Я на самом деле, только с использованием 2 физических камер — (ожидаемые) индексы устройства 0
а также 1
— что делает вывод Python3 полностью правильным и поэтому работает как задумано. Тем не менее, используя Python2, когда я получаю доступ к индексам устройства 2-4
все возвращают «правильный» видео канал с моего телефона — включая индекс 4
который определяет видеопоток 240p.
Отсюда мой вопрос; Почему выходные данные из Python2 и Python3 отличаются? Почему Python2 показывает 3 других доступных видеопотока (которые кажутся «правильными»)?
Примечание: «правильный» относится к использованию правильного физического устройства в правильном режиме, несмотря на то, что он неверен в отношении количества физических камер.
Примечание 2: весь код связан с этим вопросом с использованием гиперссылок в попытке минимизировать длину этого вопроса.
DroidCam Source 1, 2 и Mini (240p) являются фильтрами видеоисточников DirectShow. Я предполагаю, что Python 3 либо не поддерживает DirectShow, либо его использование по умолчанию отключено.
Source 3 и встроенная веб-камера используют полнофункциональные драйверы ядра.
Других решений пока нет …