C++ OpenCV 2.4.11:列出所有相机

问题描述 投票:0回答:2

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

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 块中的代码将起作用。当我在硬件管理器中停用内部摄像头(并且我的笔记本电脑上没有连接其他摄像头)时,调用失败,并显示以下错误消息(调试模式):

Exception Triggered
---------------------------
The inferior stopped because it triggered an exception.<p>Stopped in thread 0 by: 
Exception at 0x7ff8533d9090, code: 0xc0000005: read access violation at: 0x0, flags=0x0 (first chance).

以及以下 2 个构建问题:

Exception at 0x7ff871af8b9c, code: 0xa1a01db1: , flags=0x0 (first chance)

Exception at 0x7ff8533d9090, code: 0xc0000005: read access violation at: 0x0, flags=0x0 (first chance)

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

或者有没有一种方法可以让我访问 OpenCV 中所有可用的网络摄像头而不会出现这样的脏循环?

c++ opencv webcam video-capture
2个回答
5
投票

目前OpenCV中仍然没有与相机计数相关的功能(3.0.0版本) - 请参阅对应的票证

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

通常,您甚至可以实现自己的访问冲突处理程序(请查看此线程),但这确实是肮脏的伎俩。


3
投票

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

https://github.com/studiosi/OpenCVDeviceEnumerator

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

© www.soinside.com 2019 - 2024. All rights reserved.