首页 文章

C OpenCV 2.4.11:列出所有摄像头

提问于
浏览
4

我想列出所有连接的网络摄像头(USB网络摄像头和内部网络摄像头),使用C,OpenCV 2.4.11,Windows 8.1和Qt Creator 3.4.2 . 对我来说,以下列方式获取可访问的网络摄像头的数量就足够了:

VideoCapture videoCapture(0); // Will access my internal laptop webcam.
VideoCapture videoCapture(1); // Will access the first connected usb webcam.

这是我的代码:

// Following procedure detects, how many webcams are accessible from 0 on upwards.
numberOfDevices = 0;
bool noError = true;

while (noError)
{
    try
    {
        // Check if camera is available.
        VideoCapture videoCapture(numberOfDevices); // Will crash if not available, hence try/catch.

        // ...
    }
    catch (...)
    {
        noError = false;
    }

    // If above call worked, we have found another camera.
    numberOfDevices++;
}

如果我激活了我的内部网络摄像头,则try-block中的代码可以正常工作 . 当我通过以下错误消息(调试模式)停用硬件管理器中的内部摄像头(并且没有其他摄像头连接到我的笔记本电脑)时,呼叫失败:

触发异常


劣势因为触发异常而停止 . <p>在线程0中停止:
0x7ff8533d9090处的异常,代码:0xc0000005:读访问冲突位于:0x0,flags = 0x0(第一次机会) .

以及2个构建问题:

0x7ff871af8b9c异常,代码:0xa1a01db1:,flags = 0x0(第一次机会)

0x7ff8533d9090异常,代码:0xc0000005:读取访问冲突位于:0x0,标志= 0x0(第一次机会)

如何获取发生的错误?如您所见,try / catch不起作用 .

或者有没有一种方法可以在没有这么脏的循环的情况下访问OpenCV中所有可用的网络摄像头?

2 回答

  • 3

    目前 OpenCV3.0.0 版)中仍然没有任何与摄像机计数相关的功能 - 请参阅corresponding ticket .

    正确的相机处理似乎是 OpenCV 内部问题(例如,描述herehere) . 通常它在物理禁用相机后出现在捕获代码中,而它仍然在 OpenCV 中打开(当我们尝试读取被破坏的文件描述符时) .

    通常,您甚至可以为访问冲突实现自己的处理程序(请查看this thread),但这真的很脏 .

  • 1

    我创建了这个C类,允许枚举在OpenCV中使用的设备(包括ID) . 它托管在GitHub上 .

    https://github.com/studiosi/OpenCVDeviceEnumerator

    我们的想法是使用DirectShow获取具有GUID CLSID_VideoInputDeviceCategory类别的所有设备,然后通过枚举器获得它们在系统上出现的顺序,即通过创建在OpenCV上打开它们所需的ID一个VideoCapture对象(通过使用接收ID的构造函数,它将是枚举中设备的索引) . 显然,这种方法仅适用于Windows .

相关问题