Как считать камеры в OpenCV 2.3? - PullRequest
22 голосов
/ 06 сентября 2011

Я хочу получить количество доступных камер.

Я пытался считать камеры следующим образом:

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 ]

10 голосов
/ 06 февраля 2014

Даже если это старый пост, решение для 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 [Custom Build]
  • OpenCV 2.4.9
  • OpenCV 2.4.8

От 0 до 3 USB-камер

10 голосов
/ 06 сентября 2011

OpenCV по-прежнему не имеет API для перечисления камер или получения количества доступных устройств. Подробнее см. этот билет в трекере ошибок OpenCV.

Поведение VideoCapture не определено для номеров устройств, превышающих количество подключенных устройств, и зависит от API, используемого для связи с вашей камерой. См. OpenCV 2.3 (C ++, QtGui), Проблема инициализации некоторых конкретных USB-устройств и настроек для получения списка API, используемых в OpenCV.

7 голосов
/ 22 мая 2015

Это очень старый пост, но я обнаружил, что под Python 2.7 в Ubuntu 14.04 и OpenCv 3 ни одно из решений здесь не работает для меня.Вместо этого я придумал что-то вроде этого в 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()

Может быть, кто-то найдет это полезным.

5 голосов
/ 15 августа 2012

Я делаю это в 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 считает свою встроенную камеру дважды.

0 голосов
/ 13 апреля 2017

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())
0 голосов
/ 03 января 2017

Я также столкнулся с подобной проблемой.Я решил проблему с помощью библиотеки videoInput.h вместо Opencv для перечисления камер и передал индекс в объект Videocapture.Это решило мою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...