如何使用 opencv 获取网络摄像头设备列表?

Posted

技术标签:

【中文标题】如何使用 opencv 获取网络摄像头设备列表?【英文标题】:How do I get a list of webcam devices using opencv? 【发布时间】:2012-02-14 11:52:14 【问题描述】:

我正在使用带有 videoInput 的 OpenCV2.2。我想升级到 OpenCV2.3.1,其中 videoInput 显然已合并到 OpenCV2.3。

我的问题是似乎没有 listdevices() 函数来返回所有可用的视频源。

有人知道新的等价物吗?

【问题讨论】:

你能放出完整的代码吗?我正在尝试列出所有网络摄像头设备,但未成功 【参考方案1】:

正如你所说,自 2.3rc 以来,videoinput 已合并到 OpenCV 中。

查看相关的 source 视频输入似乎是在 OpenCV 更改日志指定的 highgui 中。虽然您的 OpenCV 是否在启用的情况下构建是 Cmake 中的一个可配置选项(该选项是 WITH_VIDEOINPUT 并且还要求它是 WIN32 构建,请参阅 here)。

OpenCV 在内部调用 listdevices 作为 VI.listDevices()CvCaptureCAM_DShow::open 的实现中,并且 videoInput 类是 CvCaptureCAM_DShow 的受保护成员。

您可以使用访问 listdevices 功能

 CvCapture* capture = cvCaptureFromCAM( CV_CAP_DSHOW );
 capture->VI.listDevices();

【讨论】:

启用 VI 的 CMAKE 选项是什么?你能解释一下吗?我尝试了您的示例代码 sn-p。它说 VI 不是一个有效的对象。【参考方案2】:

请参阅this *** 的答案。 OpenCV 目前不支持它,因为它是跨平台的,并且相机枚举非常特定于平台(例如,v4l2 的枚举与 DirectShow 不同)。但是,不久前有人针对 2.2 版提交了enhancement request。

【讨论】:

【参考方案3】:

我编写了一个类,允许使用 DirectShow 接口和枚举器枚举所有设备。虽然它只适用于 Windows,但它允许您获取“友好设备名称”列表和您需要创建的 id,例如 VideoCapture 对象。

代码在这里:

https://github.com/studiosi/OpenCVDeviceEnumerator

【讨论】:

以上是关于如何使用 opencv 获取网络摄像头设备列表?的主要内容,如果未能解决你的问题,请参考以下文章

C#获取网络摄像头名称列表

如何将 openCV 视频流式传输到 HTML 网页?

1.使用DShow获取本机的视音频设备和自带编解码器列表

如何在 OpenCV 中使用网络摄像头捕获 Mat 图像的像素值

使用 openCV 和 wxPython 从网络摄像头获取流

从 webrtc 将网络摄像头帧传递给 python opencv