OpenCV VideoCapture 设备索引/设备号

新手上路,请多包涵

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

据我所知,除了 VideoCapture 类构造函数 / open 方法中的 device 参数之外,没有其他方法可以识别 OpenCV 中的特定相机。

问题是设备参数会根据实际连接的摄像头数量和 USB 端口而变化。

我希望能够识别特定的相机并找到它的“设备索引”或“相机索引”,无论连接了多少相机以及连接到哪些 USB 端口。

有人可以建议一种实现该功能的方法吗? python 代码更可取,但 C++ 也可以。

原文由 Elad Maimoni 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

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

因此,在 Windows 环境下,您可以使用 MSMF 或 DSHOW 作为后端。如果您使用 MSMF 作为后端,我创建了一个简单的函数来列出设备并将其名称与其索引匹配。这里: https ://github.com/pvys/CV-camera-finder。

如果您使用 DSHOW 作为背景,这里有一篇不错的文章: https ://www.codeproject.com/Articles/1274094/Capturing-Images-from-Camera-using-Python-and-Dire

原文由 Park 发布,翻译遵循 CC BY-SA 4.0 许可协议

前言,我不使用windows,这个没有经过测试,但是是结合网上找到的答案和来源,做了一些修改。

遍历 USB 注册表项并解析 sub_key 字符串:

 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++:

原文由 jmunsch 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏