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']}")
|