baoshiwei
2025-04-22 88fc0f9f9b7fd3eb81c958ca41ed822cf3657c47
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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']}")