【问题标题】:C++ OpenCV 2.4.11: List all camerasC++ OpenCV 2.4.11:列出所有相机
【发布时间】:2016-03-15 20:21:55
【问题描述】:

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

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 中所有可用的网络摄像头,而不会出现这种脏循环?

【问题讨论】:

  • 我在 Windows 上没有观察到崩溃,在执行非常类似的操作时...
  • 好的,这似乎取决于安装的设备驱动程序。在安装 GigE 相机之前,我只是尝试打开它们来测试不存在的设备没有问题...
  • 有一个类似的线程link。评论者有不同的结果。 ://
  • 我鼓励你使用 VideoInput 库(无论如何在内部被 openCV 使用):github.com/ofTheo/videoInput

标签: c++ opencv webcam video-capture


【解决方案1】:

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

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

通常你甚至可以实现你自己的访问违规处理程序(请查看this thread),但这确实是一个肮脏的把戏。

【讨论】:

  • 感谢您的努力。我寻找别的东西,这样我就可以避免上述肮脏的伎俩。如果我找到足够的解决方案,我会更新这个主题。
【解决方案2】:

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

https://github.com/studiosi/OpenCVDeviceEnumerator

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

【讨论】:

  • 请考虑解释原始问题的解决方案,而不是链接到其他类和资源。
  • 添加了解释。还是建议看代码。
  • 这曾经在 v3 中工作,但在 v4 中,似乎顺序不匹配。有人知道如何将索引映射到相机名称吗?
  • 我没有看到OpenCV版本干扰设备枚举的原因,你是什么意思?
【解决方案3】:

在 OpenCV >4 版本中,默认 API 是 MSMF。 这是它的一个变体:https://github.com/Aoderus/OpenCV_CameraList_MSMF

【讨论】:

    猜你喜欢
    • 2016-02-21
    • 2015-06-17
    • 1970-01-01
    • 2019-12-25
    • 2015-11-06
    • 2018-01-03
    • 1970-01-01
    • 2021-05-12
    • 2016-10-22
    相关资源
    最近更新 更多