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.
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
Vous devez vous connecter pour publier un commentaire.
Oui, vous êtes certainement limitée par la bande passante du bus USB. Tenter de lire les deux appareils à pleine-rez vous avez probablement eu une erreur:
Et puis quand vous réduisez le res à 160x120:
maintenant, il semble fonctionner! Je parie que vous avez tous les deux cames connecté sur la même carte USB. Vous pouvez exécuter
lsusb
commande pour vous assurer, et il doit l'indiquer quelque chose comme:(Notez les deux appareils sur le même bus.) Si possible, vous pouvez ajouter une autre carte USB à votre ordinateur pour obtenir plus de bande passante. J'ai fait cela avant, afin d'exécuter plusieurs cames en pleine résolution sur une seule machine. Mais c'était un tour de la station de travail avec les slots de la carte mère, et, malheureusement, vous ne pouvez pas avoir cette option sur un MacBook ordinateur portable.
Il peut dépendre de ce que la résolution native de votre webcam prend en charge. Essayez d'exécuter
v4l2-ctl --all
ouv4l-info
ouv4l-conf
ou d'autres personnes à trouver un peu de res votre cames en charge, puis de travailler votre chemin jusqu'à l'échec.OriginalL'auteur Velimir Mlaker
À l'aide d'OPENCV et de deux caméras USB, j'ai été capable de faire cela en utilisant le multithreading. Essentiellement, définir une fonction qui ouvre un opencv fenêtre et VideoCapture élément. Ensuite, on crée deux threads avec l'ID de la caméra et le nom de la fenêtre en tant qu'entrées.
Grande ressource pour l'apprentissage de threads en python: https://www.tutorialspoint.com/python/python_multithreading.htm
Ne ce ne viennent que lorsque vous essayez de multi-thread? Peut-être l'adresse de la caméra (port usb de l'adresse) que vous demandez est mal, certains ordinateurs ont différentes usb mappage d'adresses. [Désolé pour la réponse tardive]
OriginalL'auteur TheoreticallyNick
J'ai utiliser "imutils" et de lire show webcam sur l'image.
capture vedio cadres
j'ai crée une fonction read_frame() envoyer un paramètre à propos de l'Image.fromarray et affichage
et finale de montrer la fonction vidéo sur le "imageFrame"
exemple.
4-webcam
Youtube:
Youtube
OriginalL'auteur บัวลอย แสนดี
Cela a été une douleur pour moi un long moment, j'ai donc fait une bibliothèque sur le dessus de OpenCV pour gérer plusieurs caméras et les fenêtres. Je suis tombé sur un tas de problèmes comme des vidéos sans compression par défaut, ou windows uniquement de l'affichage dans le thread principal. Je suis capable d'afficher deux 720p webcams en temps réel sur Windows jusqu'à présent.
Essayer:
Puis, en python:
C'est relativement nouveau mais, dites-moi tout de bugs ou unoptimized code.
OriginalL'auteur SimLeek
essayez d'utiliser ce code...
il a travaillé comme prévu...
c'est pour les deux cams,si vous voulez encore plus de caméras, il suffit de créer le "VideoCapture()" objets...par exemple, 3ème cam : cv2.VideoCapture(3) et le code correspondant dans la boucle while
TOUT LE MEILLEUR !
OriginalL'auteur Sajil Vohra
doit être:
De sorte qu'il s'exécute
OriginalL'auteur Gio Lac Cagliari
L'ajout d'un peu de ce que @TheoreticallyNick posté plus tôt:
Cela permettra d'ouvrir un nouveau thread pour chaque webcam que vous avez. Dans mon cas, j'ai voulu ouvrir trois aliments différents. Testé sur Python 3.6. Laissez-moi savoir si vous avez des questions, merci également à TheoreticallyNick pour le lisible et le fonctionnement de code!
OriginalL'auteur Jacob W. Dallas