【问题标题】:List available cameras OpenCV/Python列出可用的相机 OpenCV/Python
【发布时间】:2019-12-25 21:29:37
【问题描述】:

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

【问题讨论】:

标签: python opencv python-3.7 opencv4


【解决方案1】:

要回答问题的标题,您可以使用 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

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

版本 2

正如@ketza 所注意到的,可能存在工作端口不连续的情况,此版本将在退出 while 循环之前测试至少 5 个非工作端口:

import cv2
    
    
def list_ports():
    """
    Test the ports and returns a tuple with the available ports and the ones that are working.
    """
    non_working_ports = []
    dev_port = 0
    working_ports = []
    available_ports = []
    while len(non_working_ports) < 6: # if there are more than 5 non working ports stop the testing. 
        camera = cv2.VideoCapture(dev_port)
        if not camera.isOpened():
            non_working_ports.append(dev_port)
            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,non_working_ports

【讨论】:

  • 我发现这比选择的答案更有用,因为它在 Python 中。谢谢
  • 我实际上有一个案例,端口 0 和端口 2 有可用的摄像头,但端口 1 没有。答案中的 while 循环会在找到端口 1 不起作用后退出。我只是将 while 循环与 for 循环交换为某个任意最大端口号 (10) 以查看全部内容。
  • @ketza 感谢您的反馈我已经更新了答案。
【解决方案2】:

答案是否定的。 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()-&gt;Size返回给用户的功能。 Linux 代码有点复杂。

如果您从代码构建 OpenCV,您可以添加一个返回可用设备数量的函数。或者更好地使用您的补丁向 OpenCV 提交拉取请求。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-03-15
  • 2016-12-29
  • 2011-12-24
  • 2015-02-20
  • 2017-04-14
  • 1970-01-01
  • 2021-06-20
  • 2012-03-16
相关资源
最近更新 更多