Capturer de la vidéo à partir de deux caméras dans OpenCV à la fois

Comment capturer de la vidéo à partir de deux ou plusieurs caméras à la fois (ou presque) avec OpenCV, à l'aide de l'API Python?

J'ai trois webcams, tous capables de vidéo en streaming, situé à /dev/video0, /dev/video1, et /dev/video2.

À l'aide de la tutoriel comme un exemple, la capture d'images à partir d'une seule caméra est tout simplement:

import cv2
cap0 = cv2.VideoCapture(0)
ret0, frame0 = cap0.read()
cv2.imshow('frame', frame0)
cv2.waitKey()

Et cela fonctionne bien.

Cependant, si j'essaie d'initialiser une deuxième caméra, en essayant de read() de il retourne Aucun:

import cv2
cap0 = cv2.VideoCapture(0)
cap1 = cv2.VideoCapture(1)
ret0, frame0 = cap0.read()
assert ret0 # succeeds
ret1, frame1 = cap1.read()
assert ret1 # fails?!

Juste pour m'assurer que je n'étais pas accidentellement donnant OpenCV un mauvais appareil de l'index, j'ai testé chaque caméra index individuellement et ils fonctionnent tous par eux-mêmes. par exemple,

import cv2
#cap0 = cv2.VideoCapture(0)
cap1 = cv2.VideoCapture(1)
#ret0, frame0 = cap0.read()
#assert ret0
ret1, frame1 = cap1.read()
assert ret1 # now it works?!

Ce que je fais mal?

Edit: Mon matériel est un Macbook Pro sous Ubuntu. Des recherches sur la question spécifiquement sur les Macbooks, j'ai trouvé d'autres personnes qui ont rencontré ce problème aussi, à la fois sur OSX et avec différents types de caméras. Si j'ai accès à l'iSight, les deux appels dans mon code échouer.

Si vous modifiez l'ordre de la videoCapture déclarations de l'erreur se produit sur l'autre canal?
Cela semble fonctionner très bien pour moi sur windows.
Sont les caméras à la fois intégré ou USB? Il est possible qu'ils ne peuvent pas fonctionner en même temps, si ils sont sur le même bus série parce que un bus série, de série.
c'est une question de saturation. usb2 peine à gérer le débit d'une simple webcam, si vous voulez exécuter plusieurs cams, vous avez besoin de plus (indépendant) les contrôleurs usb. pc classique est généralement eu un avant , et un autre dans le dos
J'ai parlé trop vite. Il s'avère read() fonctionne avec de multiples caméras quand je l'ai mis à 160x120. Je suppose que c'est entièrement une largeur de bande d'émission.

OriginalL'auteur Cerin | 2015-04-16