web-dev-qa-db-fra.com

Comment compter les caméras dans OpenCV 2.3?

Je veux obtenir le nombre de caméras disponibles.

J'ai essayé de compter les caméras comme ceci:

for(int device = 0; device<10; device++) 
{
    VideoCapture cap(device);
    if (!cap.isOpened())
        return device;          
}

Si j'ai une caméra connectée, elle ne manquera jamais de s'ouvrir. J'ai donc essayé de prévisualiser différents appareils, mais je reçois toujours l'image de mon appareil photo.

Si je connecte une deuxième caméra, le périphérique 0 est la caméra 1 et le périphérique 1-10 est la caméra 2.

Je pense qu'il y a un problème avec les périphériques DirectShow.

Comment résoudre ce problème? Ou existe-t-il une fonction similaire à OpenCV1 cvcamGetCamerasCount()?

J'utilise Windows 7 et des caméras USB.

22
sirlunchalot

Même si c’est un vieux post ici une solution pour 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;
}

Testé sous Windows 7 x64 avec: 

  • OpenCV 3 [Construction personnalisée]
  • OpenCV 2.4.9
  • OpenCV 2.4.8

Avec 0 à 3 caméras USB

10
BlouBlou

OpenCV ne dispose toujours pas d'API pour énumérer les caméras ou obtenir le nombre de périphériques disponibles. Voir ce ticket sur le traqueur de bogues OpenCV pour plus de détails.

Le comportement de VideoCapture n'est pas défini pour les numéros de périphérique supérieurs au nombre de périphériques connectés et dépend de l'API utilisée pour communiquer avec votre caméra. Voir OpenCV 2.3 (C++, QtGui), problème lors de l’initialisation de certains périphériques et configurations USB spécifiques pour la liste des API utilisées dans OpenCV.

10
Andrey Kamaev

Ceci est un très vieux billet, mais j’ai trouvé que, sous Python 2.7 sur Ubuntu 14.04 et OpenCv 3, aucune des solutions ici ne fonctionnait pour moi. Au lieu de cela, j'ai trouvé quelque chose comme ça en 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()

Peut-être que quelqu'un trouvera cela utile.

7
Artur

Je fais cela en 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

Malheureusement, Opencv ouvre néanmoins l’objet Camera, même s’il n’y a rien, mais si vous essayez d’extraire son contenu, il n’y aura rien à attribuer. Vous pouvez l'utiliser pour vérifier votre nombre de caméras. Cela fonctionne dans toutes les plateformes que j'ai testées, donc c'est bien.

La raison pour renvoyer i-1 est que MacBookPro compte sa propre caméra intégrée deux fois. 

5
NinjasAtWork

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
foo bar

J'ai également été confronté à un problème similaire. J'ai résolu le problème en utilisant la bibliothèque videoInput.h au lieu de Opencv pour énumérer les caméras et en passant l'index à l'objet Videocapture. Cela a résolu mon problème.

0
Arjun Singh