将USB视频捕获设备友好名称与Python中的OpenCV端口号相关联

将USB视频捕获设备友好名称与Python中的OpenCV端口号相关联,python,opencv,usb,port,friendly-id,Python,Opencv,Usb,Port,Friendly Id,我想获得在Windows平台上使用Python的外部USB视频捕获设备的友好名称和USB端口号。我正在使用OpenCV从USB捕获设备捕获视频。OpenCV将外部USB视频捕获设备(EasyCap、Hauppauge USB Live-2等)的USB端口称为“-1”(找到的第一个工作摄像头)、“0”(对我来说,这是网络摄像头)和“1”、“2”等。以下是在OpenCV中连接网络摄像头的单线示例: cap = cv2.VideoCapture(0) 我有三个外部视频捕获设备和一个网络摄像头。以下是

我想获得在Windows平台上使用Python的外部USB视频捕获设备的友好名称和USB端口号。我正在使用OpenCV从USB捕获设备捕获视频。OpenCV将外部USB视频捕获设备(EasyCap、Hauppauge USB Live-2等)的USB端口称为“-1”(找到的第一个工作摄像头)、“0”(对我来说,这是网络摄像头)和“1”、“2”等。以下是在OpenCV中连接网络摄像头的单线示例:

cap = cv2.VideoCapture(0)
我有三个外部视频捕获设备和一个网络摄像头。以下是我的代码,它成功地显示了这些设备的友好名称(我不确定这是否适用于所有USB视频捕获设备):

结果如下:

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识别的端口号关联的建议?

我找到了一个非常有效的解决方案
CV-camera-finder
可以在这里找到:。

我不使用Windows,但我认为,如果使用
ffmpeg
命令列出设备,它们出现的顺序与OpenCV编号匹配。虽然我以前是错的,但是如果有人证明我错了,这可能会帮助我们找到答案,我对此很冷静!听起来是个合乎逻辑的想法,但没有奏效。我将设备移动到不同的USB端口,但在对命令行
ffmpeg-list_devices true-f dshow-I dummy
Ok的响应中,顺序保持不变,但它们在OpenCV中是否发生了变化?我在从设备读取OpenCV时遇到了问题。它不想识别其中的一个,我可以在10%的时间里阅读另一个。这是我试图解决的另一个问题。但回到这个问题,当我在端口周围移动设备并执行WMI脚本(如上所述)时,脚本的响应会有所不同,但与设备的移动方式不一致。@Francesco Bonizzi-很抱歉延迟了-刚刚看到它。你说得对。使用ffmpeg枚举摄影机,因为OpenCV也使用ffmpeg。我发现这基本上是正确的。我有一个例子,当一个USB捕获设备的顺序与显示的不一样时。但是,使用ffmpeg将列出与音频设备和视频设备相同的设备。在我的例子中,我只对视频感兴趣,而对音频不感兴趣,所以我不得不排除列表中任何带有“音频”的内容。它并不完美,但大多数时候都能用——对我来说已经足够好了。
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";
};