繁体   English   中英

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

[英]How to count cameras in OpenCV 2.3?

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

我试着计算这样的相机:

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相机。

即使这是一篇旧帖子,也是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仍然没有枚举相机或获取可用设备数量的API。 有关详细信息,请参阅OpenCV错误跟踪器上的此票证

VideoCapture的行为未定义为设备数量大于连接的设备数量,并且取决于用于与相机通信的API。 请参阅OpenCV 2.3(C ++,QtGui),问题初始化某些特定的USB设备和设置以获取OpenCV中使用的API列表。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM