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

时间:2011-09-06 16:11:00

标签: c++ opencv

我想获得可用相机的数量。

我试着计算这样的相机:

for(int device = 0; device<10; device++) 
{
    VideoCapture cap(device);
    if (!cap.isOpened())
        return device;          
}

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

如果连接第二台摄像机,则设备0为摄像机1,设备1-10为摄像机2。

我认为DirectShow设备存在问题。

如何解决这个问题?或者是否有类似OpenCV1 cvcamGetCamerasCount()的功能?

我使用的是Windows 7和USB相机。

6 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:10)

即使这是一篇旧文章,也是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相机

答案 2 :(得分:7)

这是一篇非常古老的帖子,但我发现在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()

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

答案 3 :(得分:5)

我在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计算了两次自己的嵌入式相机。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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())