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.
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:
Avec 0 à 3 caméras USB
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.
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.
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.
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())
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.