【问题标题】:How to count cameras in OpenCV 2.3?如何计算 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 摄像头。

【问题讨论】:

    标签: c++ opencv


    【解决方案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())
            

            【讨论】:

              猜你喜欢
              • 2020-02-20
              • 1970-01-01
              • 2015-04-30
              • 2011-11-26
              • 1970-01-01
              • 2012-06-19
              • 2018-03-31
              • 2021-03-02
              • 2015-02-27
              相关资源
              最近更新 更多