Python OpenCV视频捕获设备索引/设备编号

Python OpenCV视频捕获设备索引/设备编号,python,c++,windows,opencv,usb,Python,C++,Windows,Opencv,Usb,我有一个python环境(在Windows 10上),它使用OpenCVVideoCaptureclass连接到多个usb摄像头 据我所知,除了VideoCaptureclass构造函数中的open方法中的device参数之外,在OpenCV中无法识别特定的摄像机 问题在于,设备参数的变化取决于实际连接的摄像头数量以及usb端口 我希望能够识别一个特定的摄像头,并找到它的“设备索引”或“摄像头索引”,无论有多少摄像头连接到哪个usb端口 有人能建议一种实现该功能的方法吗?Python代码是最好的

我有一个python环境(在Windows 10上),它使用OpenCV
VideoCapture
class连接到多个usb摄像头

据我所知,除了
VideoCapture
class构造函数中的
open
方法中的
device
参数之外,在OpenCV中无法识别特定的摄像机

问题在于,设备参数的变化取决于实际连接的摄像头数量以及usb端口

我希望能够识别一个特定的摄像头,并找到它的“设备索引”或“摄像头索引”,无论有多少摄像头连接到哪个usb端口


有人能建议一种实现该功能的方法吗?Python代码是最好的,但是C++也会这样做。

< P>如果你可以用相机的编号或设备和厂商ID来区分相机,你可以在OpenCV打开之前循环所有的视频设备,搜索你想要打开的相机设备。在使用opencv打开之前,您可以循环浏览所有视频设备,并搜索要打开的相机设备。

序言,我不使用windows,这还没有经过测试,但它是联机找到的答案和来源的组合,并进行了一些修改

遍历USB注册表项并分析子项字符串:

import _winreg
usb_devices=[]
index = 0
with _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Enum\USB') as root_usb:
    while True:
        try:
            subkey = _winreg.EnumKey(root_usb, index)
            usb_devices.append(subkey)
            index += 1
        except WindowError as e:
            if e[0] == 259: # No more data is available
                break
            elif e[0] == 234: # more data is available
                index += 1
                continue
            raise e
print('parse these', usb_devices)
或者可能
Popen
a
wmic
子流程并解析
stdout

from subprocess import Popen, PIPE
results1 = Popen(['wmic', 'path', 'win32_pnpentity', 'get', 'caption' '/format:list'], stdout=PIPE)
results2 = Popen(['wmic','path','Win32_SerialPort','get','DeviceID^,Caption^,Description^,Name^,ProviderType','/format:list'], stdout=PIPE)
print('parse these', results1.stdout.read())
print('parse these', results2.stdout.read())
相关,linux、mac和windows c++:


序言,我不使用windows,这还没有经过测试,但它是从网上找到的答案和来源的组合,经过一些修改

遍历USB注册表项并分析子项字符串:

import _winreg
usb_devices=[]
index = 0
with _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Enum\USB') as root_usb:
    while True:
        try:
            subkey = _winreg.EnumKey(root_usb, index)
            usb_devices.append(subkey)
            index += 1
        except WindowError as e:
            if e[0] == 259: # No more data is available
                break
            elif e[0] == 234: # more data is available
                index += 1
                continue
            raise e
print('parse these', usb_devices)
或者可能
Popen
a
wmic
子流程并解析
stdout

from subprocess import Popen, PIPE
results1 = Popen(['wmic', 'path', 'win32_pnpentity', 'get', 'caption' '/format:list'], stdout=PIPE)
results2 = Popen(['wmic','path','Win32_SerialPort','get','DeviceID^,Caption^,Description^,Name^,ProviderType','/format:list'], stdout=PIPE)
print('parse these', results1.stdout.read())
print('parse these', results2.stdout.read())
相关,linux、mac和windows c++:


据我所知,openCV枚举设备并将其索引用作相机索引。 但它的枚举方式在后端之间可能有所不同。 无论如何,如果您可以像OpenCV一样枚举设备,那么您可以根据代码匹配设备的索引及其信息

因此,在Windows环境中,您可以使用MSMF或DSHOW作为后端。如果您使用MSMF作为后端,我制作了一个简单的函数来列出设备并将其名称与其索引相匹配。 此处:


如果您使用DSHOW作为背景,这里有一篇很好的文章:

据我所知,openCV枚举设备并将其索引用作相机索引。 但它的枚举方式在后端之间可能有所不同。 无论如何,如果您可以像OpenCV一样枚举设备,那么您可以根据代码匹配设备的索引及其信息

因此,在Windows环境中,您可以使用MSMF或DSHOW作为后端。如果您使用MSMF作为后端,我制作了一个简单的函数来列出设备并将其名称与其索引相匹配。 此处:


如果您使用DSHOW作为背景,这里有一篇很好的文章:

哪个操作系统?哪个操作系统?出于某种原因
winreg.OpenKey(winreg.HKEY\u LOCAL\u MACHINE,'system\CurrentControlSet\Enum\USB')
给了我一个
语法错误:(unicode错误)在Python 3.7/Windows 10上,“UnicodeScape”编解码器无法解码位置29-30的字节:截断\uxxxxx转义
。如果我一次降低一级密钥层次结构,我最终可以枚举
USB
值,但这些值的形式是
'VID_056A&PID_033C&MI_01'
等,因此我不知道如何将它们与OpenCV摄像机索引关联。出于某种原因
winreg.OpenKey(winreg.HKEY\u LOCAL\u MACHINE,'SYSTEM\CurrentControlSet\Enum\USB'))
给了我一个
语法错误:(unicode错误)'UnicodeScape'编解码器无法在Python 3.7/Windows 10上解码位置29-30:truncated\uxxxxx escape的字节。如果我一次降低一级密钥层次结构,我最终可以枚举
USB
值,但这些值的形式是
'VID_056A&PID_033C&MI_01'
等,所以我不知道如何将它们与OpenCV camera index关联。CV-camera-finder(函数get_MF_devices())工作得很好!我的其他方法有时有友好的名称与OpenCV设备编号不符。它工作得很好,但在我的情况下,我有3个相同名称的摄像头,我无法通过编程识别它们,因为所有3个都是“HD USB摄像头”。我试图将其“friendlyName”属性从windows注册表更改为“CAM 1”,但cameraFinder始终返回HD USB摄像头。任何帮助都非常感谢:)CV camera finder(函数get\u MF\u devices())工作得非常好!我的其他方法有时有友好的名称与OpenCV设备编号不符。它工作得很好,但在我的情况下,我有3个相同名称的摄像头,我无法通过编程识别它们,因为所有3个都是“HD USB摄像头”。我试图将其“friendlyName”属性从windows注册表更改为“CAM 1”,但cameraFinder始终返回HD USB摄像头。任何帮助都将不胜感激:)