Я хочу получить понятные имена и номера портов USB для внешних устройств видеозахвата USB, используя Python на платформе Windows. Я использую OpenCV для захвата видео с устройства захвата USB. OpenCV обозначает порты USB как «-1» (первая найденная рабочая камера), «0» (для меня это веб-камера) и «1», «2» и т. Д. c. для внешних устройств видеозахвата USB (EasyCap, Hauppauge USB Live-2 и др. c.). Вот пример однострочного подключения к веб-камере в OpenCV:
cap = cv2.VideoCapture(0)
У меня есть три внешних устройства захвата видео и веб-камера. Вот мой код, который успешно показывает понятное имя только этих устройств (я не уверен, что это будет работать для каждого USB-устройства захвата видео):
import wmi
c = wmi.WMI()
wql = "Select * From Win32_USBControllerDevice"
for item in c.query(wql):
a = item.Dependent.PNPClass
b = item.Dependent.Name.upper()
if (a.upper() == 'MEDIA' or a.upper() == 'CAMERA') and 'AUDIO' not in b:
print(item.Dependent.Name)
Результаты:
Integrated Webcam
Hauppauge USB-Live2
USB TV Tuner
USB Video Device
Я могу напечатать всю информацию об устройстве, если заменить оператор печати на
print(item.Dependent)
, а затем получу следующие результаты:
instance of Win32_PnPEntity
{
Caption = "Integrated Webcam";
ClassGuid = "{ca3e7ab9-b4c3-4ae6-8251-579ef933890f}";
CompatibleID = {"USB\\Class_0e&SubClass_03&Prot_00", "USB\\Class_0e&SubClass_03", "USB\\Class_0e"};
ConfigManagerErrorCode = 0;
ConfigManagerUserConfig = FALSE;
CreationClassName = "Win32_PnPEntity";
Description = "USB Video Device";
DeviceID = "USB\\VID_0BDA&PID_5686&MI_00\\6&153A3DF0&0&0000";
HardwareID = {"USB\\VID_0BDA&PID_5686&REV_5729&MI_00", "USB\\VID_0BDA&PID_5686&MI_00"};
Manufacturer = "Microsoft";
Name = "Integrated Webcam";
PNPClass = "Camera";
PNPDeviceID = "USB\\VID_0BDA&PID_5686&MI_00\\6&153A3DF0&0&0000";
Present = TRUE;
Service = "usbvideo";
Status = "OK";
SystemCreationClassName = "Win32_ComputerSystem";
SystemName = "MY-LAPTOP";
};
instance of Win32_PnPEntity
{
Caption = "Hauppauge USB-Live2";
ClassGuid = "{4d36e96c-e325-11ce-bfc1-08002be10318}";
CompatibleID = {"USB\\Class_ff&SubClass_ff&Prot_ff", "USB\\Class_ff&SubClass_ff", "USB\\Class_ff"};
ConfigManagerErrorCode = 0;
ConfigManagerUserConfig = FALSE;
CreationClassName = "Win32_PnPEntity";
Description = "Hauppauge USB-Live2";
DeviceID = "USB\\VID_2040&PID_C200&MI_01\\6&19EA708B&0&0001";
HardwareID = {"USB\\VID_2040&PID_C200&REV_4001&MI_01", "USB\\VID_2040&PID_C200&MI_01"};
Manufacturer = "Hauppauge";
Name = "Hauppauge USB-Live2";
PNPClass = "MEDIA";
PNPDeviceID = "USB\\VID_2040&PID_C200&MI_01\\6&19EA708B&0&0001";
Present = TRUE;
Service = "hcw10bda";
Status = "OK";
SystemCreationClassName = "Win32_ComputerSystem";
SystemName = "MY-LAPTOP";
};
instance of Win32_PnPEntity
{
Caption = "USB TV Tuner";
ClassGuid = "{4d36e96c-e325-11ce-bfc1-08002be10318}";
CompatibleID = {"USB\\Class_FF&SubClass_00&Prot_FF", "USB\\Class_FF&SubClass_00", "USB\\Class_FF"};
ConfigManagerErrorCode = 0;
ConfigManagerUserConfig = FALSE;
CreationClassName = "Win32_PnPEntity";
Description = "USB TV Tuner";
DeviceID = "USB\\VID_1B71&PID_3002\\300000000002";
HardwareID = {"USB\\VID_1B71&PID_3002&REV_0100", "USB\\VID_1B71&PID_3002"};
Manufacturer = "Active Development Co., Ltd.";
Name = "USB TV Tuner";
PNPClass = "MEDIA";
PNPDeviceID = "USB\\VID_1B71&PID_3002\\300000000002";
Present = TRUE;
Service = "X86BDA";
Status = "OK";
SystemCreationClassName = "Win32_ComputerSystem";
SystemName = "MY-LAPTOP";
};
instance of Win32_PnPEntity
{
Caption = "USB Video Device";
ClassGuid = "{ca3e7ab9-b4c3-4ae6-8251-579ef933890f}";
CompatibleID = {"USB\\Class_0e&SubClass_03&Prot_00", "USB\\Class_0e&SubClass_03", "USB\\Class_0e"};
ConfigManagerErrorCode = 0;
ConfigManagerUserConfig = FALSE;
CreationClassName = "Win32_PnPEntity";
Description = "USB Video Device";
DeviceID = "USB\\VID_1E4E&PID_701F&MI_00\\6&3543E1D5&0&0000";
HardwareID = {"USB\\VID_1E4E&PID_701F&REV_0100&MI_00", "USB\\VID_1E4E&PID_701F&MI_00"};
Manufacturer = "Microsoft";
Name = "USB Video Device";
PNPClass = "Camera";
PNPDeviceID = "USB\\VID_1E4E&PID_701F&MI_00\\6&3543E1D5&0&0000";
Present = TRUE;
Service = "usbvideo";
Status = "OK";
SystemCreationClassName = "Win32_ComputerSystem";
SystemName = "MY-LAPTOP";
};
В этих результатах должно быть что-то, что указать порт, к которому подключены внешние устройства, но я его не вижу. Предложения о том, как связать понятное имя с номером порта, который распознает OpenCV?