【问题标题】:OpenCV VideoCapture device index / device numberOpenCV VideoCapture 设备索引/设备号
【发布时间】:2017-05-08 23:46:47
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 哪个操作系统?

标签: python c++ windows opencv usb


【解决方案1】:

据我所知,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

【讨论】:

  • CV-camera-finder(函数 get_MF_devices())效果很好!我的其他方法有时的友好名称与 OpenCV 设备编号不符
  • 它工作得很好,但是在我的情况下,我有 3 个同名的摄像头,我无法以编程方式识别它们,因为所有 3 个都是“高清 USB 摄像头”。我试图将其“friendlyName”属性从 Windows 寄存器更改为“CAM 1”,但 cameraFinder 总是返回 HD USB Camera。任何帮助都会非常感激:)
【解决方案2】:

前言,我不用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 一个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++:

【讨论】:

  • 出于某种原因,winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Enum\USB') 在 Python 3.7/Windows 10 上给了我一个 SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 29-30: truncated \UXXXXXXXX escape。如果我一次将密钥层次结构降低一层,我最终可以枚举 USB 值,但这些是'VID_056A&PID_033C&MI_01' 等形式,所以我不知道如何将这些与 OpenCV 相机索引相关联。
【解决方案3】:

如果您可以通过序列号或设备和供应商ID来区分摄像机,则可以在使用opencv打开之前循环遍历所有视频设备并搜索您要打开的摄像机设备。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 2022-10-03
    • 1970-01-01
    相关资源
    最近更新 更多