Подтвердить что ты не робот

Как считать камеры в 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.

4b9b3361

Ответ 1

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

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

Ответ 2

Даже если это старое сообщение здесь, решение для OpenCV 2/С++

/**
 * 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-камер

Ответ 3

Это очень старый пост, но я обнаружил, что под 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()

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

Ответ 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())