2011-09-06 33 views
21

我想获得可用摄像头的数量。如何在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摄像头。

回答

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实现反正打开相机对象,即使什么都没有,但如果你尝试提取它的内容,将有没什么属性。你可以用它来检查你的摄像机数量。它适用于我测试过的每个平台,所以它很好。

返回i-1的原因是MacBookPro计算了两次自己的嵌入式相机。

+1

这是因为,如果你把'ID = -1'将采取的第一个可用摄像.. – Lipis

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 64位系统测试了:

  • OpenCV的3 [自定义生成]
  • OpenCV的2.4。 9
  • OpenCV 2.4.8

与0至3个USB相机

+0

崩溃的OpenCV的2.4.8打开相机时,如果不存在。 – Prasaathviki

+0

2.4.9不会崩溃(Windows 8.1)。但是,如果您尝试接收新图像并尝试在没有执行“.isEmpty”检查的情况下使用它(因为被遮挡的凸轮抓取的图像为空),它也会发现被另一个进程阻止的相机。不知何故,OpenCV崩溃了我的相机,并没有解锁它,即使电脑重新启动后,所以我不得不停用它在操作系统中,并稍后重新激活... – Micka

+0

你有你的代码在Git的某处,我也有Windows 8.1,我想检查如果它是Windows平台问题或OpenCV错误 – BlouBlou

6

这是一个很旧的帖子,但我发现在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() 

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

0

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

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