如何计算 OpenCV 2.3 中的摄像头?

Posted

技术标签:

【中文标题】如何计算 OpenCV 2.3 中的摄像头?【英文标题】:How to count cameras in OpenCV 2.3? 【发布时间】:2011-09-06 16:11:00 【问题描述】:

我想获取可用摄像头的数量。

我试着像这样数相机:

for(int device = 0; device<10; device++) 

    VideoCapture cap(device);
    if (!cap.isOpened())
        return device;          

如果我连接了摄像头,它就永远无法打开。 所以我尝试预览不同的设备,但我总是得到我相机的图像。

如果我连接第二个摄像头,设备 0 是摄像头 1,设备 1-10 是摄像头 2。

我认为 DirectShow 设备存在问题。

如何解决这个问题?或者有没有类似OpenCV1cvcamGetCamerasCount()的功能?

我使用的是 Windows 7 和 USB 摄像头。

【问题讨论】:

【参考方案1】:

OpenCV 仍然没有 API 来枚举相机或获取可用设备的数量。有关详细信息,请参阅 OpenCV 错误跟踪器上的 this ticket。

对于大于已连接设备数的设备编号,VideoCapture 的行为未定义,并且取决于用于与您的相机通信的 API。有关 OpenCV 中使用的 API 列表,请参阅 OpenCV 2.3 (C++,QtGui), Problem Initializing some specific USB Devices and Setups。

【讨论】:

【参考方案2】:

即使这是一个旧帖子,这里也是 OpenCV 2/C++ 的解决方案

/**
 * Get the number of camera available
 */
int countCameras()

   cv::VideoCapture temp_camera;
   int maxTested = 10;
   for (int i = 0; i < maxTested; i++)
     cv::VideoCapture temp_camera(i);
     bool res = (!temp_camera.isOpened());
     temp_camera.release();
     if (res)
     
       return i;
     
   
   return maxTested;

在 Windows 7 x64 下测试:

OpenCV 3 [自定义构建] OpenCV 2.4.9 OpenCV 2.4.8

带有 0 到 3 个 USB 摄像头

【讨论】:

如果不存在,则打开相机时在 opencv 2.4.8 上崩溃。 2.4.9 对我来说不会崩溃(Windows 8.1)。但是,它还会发现一个被另一个进程阻塞的相机,如果您尝试接收新图像并尝试在没有.isEmpty 检查的情况下使用它(因为被阻塞的凸轮抓取的图像是空的),它将崩溃。不知何故,OpenCV 让我的相机崩溃了,即使在电脑重启后也没有解锁它,所以我不得不在操作系统中停用它并稍后重新激活...... 你的代码在 Git 的某个地方吗,我也有 windows 8.1,我想检查它是 Windows 平台问题还是 OpenCV 错误 @jgd : 你能告诉我你使用的女巫版本,多少个摄像头,在女巫系统上能够再次检查我的代码(一年前完成) @BlouBlou Windows,opencv 2.4.2,在带有两个摄像头的平板电脑上。而在笔记本电脑上进行的另一项测试,使用相同版本的 opencv,只有一个摄像头【参考方案3】:

这是一篇非常古老的帖子,但我发现在 Ubuntu 14.04 和 OpenCv 3 上的 Python 2.7 下,这里的解决方案都没有为我工作。相反,我在 Python 中想出了类似的东西:

import cv2

def clearCapture(capture):
    capture.release()
    cv2.destroyAllWindows()

def countCameras():
    n = 0
    for i in range(10):
        try:
            cap = cv2.VideoCapture(i)
            ret, frame = cap.read()
            cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            clearCapture(cap)
            n += 1
        except:
            clearCapture(cap)
            break
    return n

print countCameras()

也许有人会觉得这很有用。

【讨论】:

【参考方案4】:

我在 Python 中这样做:

def count_cameras():
    for i in range(10):
        temp_camera = cv.CreateCameraCapture(i-1)
        temp_frame = cv.QueryFrame(temp_camera)
        del(temp_camera)
        if temp_frame==None:
            del(temp_frame)
            return i-1 #MacbookPro counts embedded webcam twice

可悲的是,Opencv 无论如何都会打开 Camera 对象,即使那里什么也没有,但是如果您尝试提取其内容,则将没有任何内容可归因。您可以使用它来检查您的相机数量。它适用于我测试的每个平台,所以很好。

返回i-1的原因是MacBookPro对自己的嵌入式摄像头计数了两次。

【讨论】:

【参考方案5】:

我也遇到过类似的问题。我通过使用 videoInput.h 库而不是 Opencv 来枚举摄像机并将索引传递给 Videocapture 对象,从而解决了这个问题。它解决了我的问题。

【讨论】:

【参考方案6】:

Python 3.6:

import cv2

# Get the number of cameras available
def count_cameras():
    max_tested = 100
    for i in range(max_tested):
        temp_camera = cv2.VideoCapture(i)
        if temp_camera.isOpened():
            temp_camera.release()
            continue
        return i

print(count_cameras())

【讨论】:

以上是关于如何计算 OpenCV 2.3 中的摄像头?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV - 从 C/C++ 中的默认网络摄像头获取图片 - GTK 问题

如何利用opencv计算图像畸变系数,并进行校正与摄像机标定?

今天大佬教你用Python3-OpenCV实现实时摄像头人脸检测

如何opencv读取摄像头并保存每一帧图像?

如何opencv读取摄像头并保存每一帧图像

一次从 OpenCV 中的两个摄像头捕获视频