列出可用的相机OpenCV / Python

时间:2019-08-20 15:55:35

标签: python opencv python-3.7 opencv4

我有多个网络摄像头连接到PC,我想根据其信息(名称,分辨率等)选择一台摄像机。有没有办法列出PC上所有可用的摄像机,而不是尝试cv2.VideoCapture()中的所有索引?

2 个答案:

答案 0 :(得分:4)

要回答问题的标题,可以使用while循环:

import cv2


def list_ports():
"""
Test the ports and returns a tuple with the available ports and the ones that are working.
"""
    is_working = True
    dev_port = 0
    working_ports = []
    available_ports = []
    while is_working:
        camera = cv2.VideoCapture(dev_port)
        if not camera.isOpened():
            is_working = False
            print("Port %s is not working." %dev_port)
        else:
            is_reading, img = camera.read()
            w = camera.get(3)
            h = camera.get(4)
            if is_reading:
                print("Port %s is working and reads images (%s x %s)" %(dev_port,h,w))
                working_ports.append(dev_port)
            else:
                print("Port %s for camera ( %s x %s) is present but does not reads." %(dev_port,h,w))
                available_ports.append(dev_port)
        dev_port +=1
    return available_ports,working_ports

这是在您的代码上实现的非常简单的解决方案。

答案 1 :(得分:0)

答案是否定的。 OpenCV没有列出系统上可用视频捕获设备的方法。如果看一下代码,您会看到OpenCV当前如何处理不存在的无效设备索引。例如,对于MacOS,这里是the code

if ( cameraNum < 0 || devices.count <= NSUInteger(cameraNum) ) {
    fprintf(stderr, "OpenCV: out device of bound (0-%ld): %d\n", devices.count-1, cameraNum);
    [localpool drain];
    return 0;
}

您看到devices.count返回了可用设备的数量,但是OpenCV没有将其返回给用户的方法。

Windows的相关代码为here

if ((unsigned)m_deviceID >= m_devices.Get()->Size)
{
    OutputDebugStringA("Video::initGrabber - no video device found\n");
    return false;
}

同样,没有将m_devices.Get()->Size返回给用户的功能。 Linux代码要复杂一些。

如果要通过代码构建OpenCV,则可以添加一个函数,该函数返回可用设备的数量。甚至最好将修补程序与您的补丁一起提交拉取请求。