刘虾 2025-12-03 18:56 采纳率: 49.4%
浏览 3
已结题

python按照windows系统设备管理器的位置信息读取摄像头的图像,同时接入相同型号多个摄像头

python按照windows系统设备管理器的位置信息读取摄像头的图像,同时接入相同型号的多个摄像头

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2025-12-03 19:01
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    在 Windows 系统中,通过设备管理器可以查看摄像头的硬件信息(如位置信息、设备 ID 等),但直接从设备管理器读取摄像头图像并接入多个相同型号的摄像头并不是一个直接可行的方法。不过,可以通过摄像头的设备 ID 或 USB 接口信息来识别和访问多个摄像头

    以下是一个详细的解决方案,包括如何识别摄像头、如何访问多个摄像头以及如何处理相同型号的摄像头。


    目标:

    • 通过设备管理器获取摄像头的位置信息
    • 在 Python 中读取摄像头图像
    • 同时接入多个相同型号的摄像头

    解决方案

    1. 获取摄像头设备信息(如设备 ID)

    在 Windows 上,可以通过 pywin32 库访问设备管理器的信息,从而获取摄像头的设备 ID 和其他硬件信息。

    步骤:

    • 安装依赖库:
    pip install pywin32
    
    • 使用 Python 获取摄像头设备信息:
    import win32com.client
    
    def get_camera_devices():
        wmi = win32com.client.GetObject("winmgmts:")
        devices = wmi.ExecQuery("SELECT * FROM Win32_PnPEntity WHERE Caption LIKE '%Camera%'")
        
        for dev in devices:
            print(f"设备名称: {dev.Name}")
            print(f"设备ID: {dev.DeviceID}")
            print(f"制造商: {dev.Manufacturer}")
            print("-" * 40)
    
    get_camera_devices()
    

    输出示例:

    设备名称: Integrated Camera
    设备ID: USB\VID_04F2&PID_B567\6&2B8C39E3&0&1
    制造商: Microsoft
    ----------------------------------------
    设备名称: HD Pro Webcam C920
    设备ID: USB\VID_046D&PID_0825\7&2A1F2C1&0&1
    制造商: Logitech
    ----------------------------------------
    

    重点: 每个摄像头都有唯一的设备 ID,即使它们是相同型号。


    2. 通过设备 ID 打开摄像头

    虽然 OpenCV 默认使用 cv2.VideoCapture(index) 来打开摄像头,但它并不支持直接根据设备 ID 打开摄像头。为了实现这一点,可以使用 pywin32pyds 等库来获取更详细的设备信息,并结合 DirectShow 接口进行访问。

    使用 DirectShow 接口访问摄像头(推荐)

    import cv2
    from pyds import DSDevice
    
    def open_camera_by_device_id(device_id):
        # 使用 DirectShow 的设备 ID 打开摄像头
        cap = DSDevice(device_id)
        if not cap.isOpened():
            print("无法打开摄像头")
            return None
        return cap
    
    # 示例:使用设备 ID 打开摄像头
    device_id = "USB\\VID_04F2&PID_B567\\6&2B8C39E3&0&1"
    cap = open_camera_by_device_id(device_id)
    
    while True:
        ret, frame = cap.read()
        if not ret:
            break
        cv2.imshow('Camera', frame)
        if cv2.waitKey(1) == 27:
            break
    
    cap.release()
    cv2.destroyAllWindows()
    

    注意: pyds 是一个第三方库,可能需要额外安装或配置。


    3. 同时接入多个相同型号的摄像头

    如果多个摄像头是相同型号(如两个 Logitech C920),但它们的设备 ID 不同,可以通过遍历设备 ID 来同时访问它们。

    代码示例:

    import cv2
    from pyds import DSDevice
    
    def get_all_camera_ids():
        wmi = win32com.client.GetObject("winmgmts:")
        devices = wmi.ExecQuery("SELECT * FROM Win32_PnPEntity WHERE Caption LIKE '%Camera%'")
        return [dev.DeviceID for dev in devices]
    
    def main():
        camera_ids = get_all_camera_ids()
        caps = []
        
        for device_id in camera_ids:
            cap = DSDevice(device_id)
            if cap.isOpened():
                caps.append(cap)
        
        while True:
            frames = []
            for cap in caps:
                ret, frame = cap.read()
                if ret:
                    frames.append(frame)
                else:
                    frames.append(None)
            
            for i, frame in enumerate(frames):
                if frame is not None:
                    cv2.imshow(f'Camera {i}', frame)
            
            if cv2.waitKey(1) == 27:
                break
        
        for cap in caps:
            cap.release()
        cv2.destroyAllWindows()
    
    if __name__ == "__main__":
        main()
    

    注意事项

    • 设备 ID 需要唯一:不同摄像头的设备 ID 必须不同,否则无法区分。
    • OpenCV 的局限性:OpenCV 默认不支持通过设备 ID 打开摄像头,需借助其他库(如 pyds)。
    • 性能问题:同时打开多个摄像头可能会占用较多系统资源,建议控制数量。
    • 驱动兼容性:确保摄像头驱动已正确安装,并且支持 DirectShow 或其他接口。

    总结

    | 步骤 | 内容 | |------|------| | 1 | 使用 pywin32 获取摄像头设备 ID | | 2 | 通过设备 ID 打开摄像头(推荐使用 pyds) | | 3 | 遍历所有摄像头设备 ID,同时接入多个摄像头 |

    重点: 多个相同型号的摄像头可通过其唯一的设备 ID 区分并同时接入。

    如需进一步自动化或集成到项目中,可将设备 ID 存储为配置文件,并动态加载摄像头。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月23日
  • 已采纳回答 12月15日
  • 创建了问题 12月3日