web-dev-qa-db-fra.com

OpenCV Python: cv2.VideoCapture ne peut trouver que 2 caméras sur 3, l'application Appareil photo Windows trouve tout

J'essaie de créer 3 images de capture en temps réel avec des webcams dans un concentrateur USB dans mon ordinateur portable. En utilisant l'application "caméra" sous Windows, je peux changer la source de la caméra une à la fois et confirmer que les 3 webcams fonctionnent. Cependant, mon code OpenCV Python code ne peut jamais en trouver que deux.

(Notes rapides sur l'USB - c'est un concentrateur USB 3.0, le port d'ordinateur portable est USB 3, et j'ai même un câble USB femelle-à-mâle actif entrant dans l'ordinateur portable, donc étant donné que cela et l'application Windows fonctionnent, je fais généralement confiance à la Matériel.)

Ci-dessous, j'ai fait quelques tests bruts de cv2.VideoCapture(src) avec les résultats ci-dessous:

cams_test = 10
for i in range(0, cams_test):
    cap = cv2.VideoCapture(i)
    test, frame = cap.read()
    print("i : "+str(i)+" /// result: "+str(test))

Ce premier argument, test, renvoie True/False selon que le cadre peut être lu. Résultats:

i : 0 /// result: True
i : 1 /// result: True
i : 2 /// result: False
i : 3 /// result: False
i : 4 /// result: False
i : 5 /// result: False
i : 6 /// result: False
i : 7 /// result: False
i : 8 /// result: False
i : 9 /// result: False

Comme avec d'autres exemples de code que j'ai testés, seules 2 webcams peuvent être enregistrées et afficher des images en Python. Et l'application pour appareil photo Windows 10 me permet de faire défiler les 3 flux de webcam en fonctionnement et connectés.

Je sais que je peux créer plusieurs cadres, comme 3+, cv2.imshow() si j'utilise les caps qui fonctionnent. Mon projet consiste à faire cela pour afficher les flux de webcam USB en temps réel sur l'ordinateur portable à partir de plusieurs caméras.

Toute aide et conseil appréciés; également potentiellement intéressé par des solutions alternatives (basées sur Python). À votre santé.

14
JDS

avoir deux périphériques d'entrée vidéo ne signifie pas automatiquement que leurs ID sont 0 et 10. Essayez d'accéder à toutes les caméras en augmentant à environ 500 ou plus au lieu de 10

cams_test = 500
for i in range(0, cams_test):
    cap = cv2.VideoCapture(i)
    test, frame = cap.read()
    if test:
        print("i : "+str(i)+" /// result: "+str(test))

Je pense que tu testes seulement

4
kishea

Vos webcams prennent-elles en charge USB3? Sur la base de mon expérience pratique avec les webcams et OpenCV, les caméras les plus courantes ne transmettent que sur la norme USB2, à 480 Mbits/s. Les détails exacts du nombre de caméras que vous pouvez prendre en charge sur un canal USB dépendent de la résolution, de la fréquence d'images et de la technologie de compression vidéo. D'après mon expérience, avec la vidéo couleur 1080p à 30 ips et l'encodage H.264, un seul flux de caméra peut être installé sur un seul contrôleur USB.

Un test facile pour voir si vous êtes limité en bande passante serait de modifier votre programme pour fermer explicitement chaque flux après son test (cap.release()), de sorte que votre programme de test n'ouvre qu'une caméra à la fois, comme le Application appareil photo Windows. Si cela fonctionne, vous envisagez peut-être très bien une limitation de la bande passante.

Lors du débogage de problèmes de capture vidéo sous Windows, il peut également être utile d'ouvrir les flux de caméra avec VLC . VLC peut énumérer toutes les caméras disponibles à partir de DirectShow, qui est la même API que VideoCapture d'OpenCV utilise par défaut. Vous pouvez également démarrer plusieurs instances VLC pour tenter des flux simultanés.

Si vous cliquez sur "Options avancées" puis cochez "Propriétés du périphérique", VLC montrera quels paramètres (exposition, mise au point, etc.) peuvent être modifiés via DirectShow. Ces paramètres sont généralement accessibles dans OpenCV via VideoCapture.set() .

4
Jack C.

1) environ cv2... Eh bien, existe-t-il d'autres instances/alternatives? peut-être que la troisième came est liée à une autre instance au lieu de cv2?

2) avez-vous essayé de démarrer la boucle (plage) à partir de -1 au lieu de 0?

3) Si aucune des méthodes ne vous aide, je vous conseille d'aller à Device Manager et DÉSACTIVER temporairement la webcam individuelle, puis réexécutez votre script et voyez les modifications. Après cette webcam ACTIVER et voir ce qui a changé. (dans le pire des cas, au lieu d'activer/désactiver, vous pouvez installer/resaller la webcam en particulier, puis les fenêtres peuvent les résoudre correctement).

2
T.Todua

Tout d'abord, nous devons tester que votre webcam peut ou ne peut pas être connectée à OPENCV.

connectez une seule webcam et exécutez votre programme avec cv2.VideoCapture(0). Le paramètre 0 signifie qu'une seule caméra est connectée. si toute votre webcam est ok, alors ce sera un problème d'index, il y a du code qui trouvera le deviceID assigné à la cam .

et si une webcam échoue malheureusement, ce sera difficile.

Dans ce cas, vous devez créer votre propre fonction qui récupère à l'aide du SDK et écrire l'image dans un cv :: Mat.

1
obgnaw