import cv2 import win32com.client import re def get_camera_index_by_hardware_id(): # 获取所有摄像头硬件信息 wmi = win32com.client.GetObject("winmgmts:") cameras = [] wmi_instances_of = wmi.InstancesOf("Win32_PnPEntity") for item in wmi_instances_of: if "Camera" == getattr(item, 'PNPClass', None): # 提取设备实例路径(如 USB\VID_046D&PID_0825\...) device_id = item.DeviceID cameras.append({ "name": item.Name, "device_id": device_id }) # 遍历 OpenCV 索引,获取硬件信息 opencv_indices = [] for index in range(0, 10): cap = cv2.VideoCapture(index, cv2.CAP_DSHOW) # 使用 DirectShow 接口 if not cap.isOpened(): continue # 获取 OpenCV 捕获设备的硬件路径(需转换格式) cap_props = cap.getBackendName() hw_info = str(cap.get(cv2.CAP_PROP_HW_DEVICE)) # 部分驱动支持 # 匹配设备实例路径中的关键标识符(如 VID/PID) for cam in cameras: # 转换格式(例如:将 USB\VID_XXXX&PID_XXXX 与硬件路径匹配) if re.search(cam["device_id"].split("\\")[-1], hw_info, re.IGNORECASE): opencv_indices.append({ "index": index, "name": cam["name"], "device_id": cam["device_id"] }) break cap.release() return opencv_indices # 测试代码 cameras = get_camera_index_by_hardware_id() for cam in cameras: print(f"Index: {cam['index']} | Name: {cam['name']}")