Capture de plusieurs webcams (uvcvideo) avec OpenCV sous Linux
Je suis en train d'en continu et simultanément les images à partir de 3 Logitech Webcam Pro 900 appareils à l'aide d'OpenCV 2.1 sur Ubuntu 11.10. Le pilote uvcvideo est chargé pour ces.
La capture de deux appareils fonctionne très bien, mais avec trois, j'ai couru dans l'espace de l'erreur pour le troisième:
libv4l2: error turning on stream: No space left on device
Je semble être en cours d'exécution sur cette question:
http://renoirsrants.blogspot.com.au/2011/07/multiple-webcams-on-zoneminder.html et j'ai tenté de faire des caprices=128 (ou à peu près n'importe quelle autre puissance-de-deux de la valeur) truc mais en vain. J'ai aussi essayé sur une autre machine avec deux hubs USB 2.0 et connexion de deux appareils photo de l'un et de l'autre caméra à la seconde, ce qui a entraîné dans le même problème. Je suis de l'initialisation à peu près comme suit (à l'aide de N caméras, donc le résultat est effectivement mis dans un vecteur STL):
cv::VideoCapture cap0(0); //(0,1,2..)
et de tenter de capturer toutes les caméras dans une boucle comme
cap0.retrieve(frame0);
Cela fonctionne très bien pour N=2 caméras. Lorsque j'ai mis N=3 la troisième fenêtre s'ouvre mais aucune image n'apparaît, et la console est spammé plein de V4L2 erreurs. De même, lorsque j'ai mis N=2, et essayez d'ouvrir la troisième caméra en dire du Fromage (simple webcam capture d'application), cela ne fonctionne pas non plus.
Maintenant vient le gros mais: Après avoir essayé guvcview en commençant par les trois instances de ça, j'ai été en mesure d'afficher trois appareils à la fois (avec pas de problèmes en termes de taux de trame ou connexes), de sorte qu'il ne semble pas être un problème matériel. Je l'ai trouver il y a quelque chose que je dois régler, mais je ne suis pas sûr de ce qui est. J'ai regardé dans MJPEG (ces appareils semblent venir à l'appui), mais n'ont pas réussi dans la définition de cette propriété, ou de détecter le mode (yuyv?) ils sont en cours d'exécution si je commence à partir d'OpenCV.
Pensées?
source d'informationauteur geez
Vous devez vous connecter pour publier un commentaire.
J'ai eu exactement ce problème, à l'aide de trois logitech quickcam pro 9000 caméras (ubuntu). J'ai pu lire à partir de deux, mais pas trois. Dans mon cas, je n'étais pas à l'aide d'opencv, mais a été accéder à des caméras V4L2 directement, en utilisant la mémoire mappée IO. Tout simplement, il n'y a pas assez d'USB de bande passante à allouer trois tampons.
Je lisais dans les trames non compressées, cependant. Dès que j'ai changé le format MJPEG, les données sont assez petit, et j'ai pu lire à partir de trois caméras. J'ai utilisé libjpeg pour décoder le flux MJPEG.
Je n'ai pas regardé comment changer le format d'image à l'aide d'OpenCV, mais je sais qu'il doit être MJPEG pour s'adapter à toutes les données.
Avant, je suis passé à MJPEG, j'ai passé beaucoup de temps à essayer d'accès de chaque caméra, un à la fois, la diffusion d'une image unique avant de passer à la suivante. Pas recommandé!
J'ai eu ce problème aussi, et disposez d'une solution qui me permet de capturer des 2 appareils-photo en 640x480 avec la compression de mjpeg. Je suis à l'aide d'un Créatif "Live Cam Sync HD VF0770" qui signale de manière incorrecte les besoins en bande passante. Les bizarreries=128 correctif fonctionne pour 320x240 de la vidéo non compressée. Mais pour compressé (mjpg) format de la bizarreries=128 ne fonctionne pas (il ne fait rien pour les formats compressés).
Pour corriger cela j'ai modifié le pilote uvc comme suit:
télécharger les sources du noyau
copie uvc dir:
modifier le Makefile
La Force de la bande passante à 0 x 400 lors de la compression.
construire la aauvcvideo module:
supprimer l'ancien module et insérez un nouveau:
exécuter gucview deux fois avec la compression dans les 2 fenêtres différentes pour tester
Bonne chance!
-Gland
Il est probablement USB largeur de bande de contention signalée par le pilote de périphérique de capture vidéo. Vérifiez si le format de pixel est YUYV, qui se trouve être décompressé. Au contraire, si le format de pixel est MJPG (compressé), il est possible d'avoir plusieurs appareils sur la même clé de canal.
La sortie serait quelque chose comme ci-dessous:
Les éléments suivants sont les solutions possibles:
OpenCV peut être construit pour utiliser v4l ou de libv4let seul le v4l version prend en charge les formats de compression, tandis que la libv4l version prend en charge un format non compressé pour OpenCV 2.4.11. (Voir autosetup_capture_mode_v4l2() pour v4l et le code suivant ligne 692 pour libv4l.) OpenCV 3.0.0 ne s'est pas beaucoup améliorée au cours 2.4.11 ici; elle prend en charge uniquement les formats non compressés pour libv4l.
Depuis votre erreur mentionne
libv4l2
vous semblez avoir la libv4l version et OpenCV capturé non compressé dans votre cas. Pour construire un v4l version d'OpenCV, votre commande cmake doit contenir(
WITH_LIBV4L
a été activé par défaut pour moi.)Une remarque sur la bande passante et USB. USB 2.0 (dont pratiquement toutes les webcams utilisation) a une largeur de bande de 480 Mbit/s. 640 x 480 à 30 fps et 24 bits/pixel non compressé est d'environ 221 Mbit/s, de sorte que l'on peut utiliser jusqu'USB 2.0 largeur de bande rapidement avec non compressé webcams. On obtient 480 Mbit/s pour chaque USB contrôleur hôtevoir ce réponse sur la façon de dresser la liste. (USB moyeux ne pas ajouter des contrôleurs d'hôte, et de plusieurs ports USB sur une carte mère sont généralement connectés à la même contrôleur hôte. Tous les périphériques et les centres connecté à un contrôleur hôte partage de la bande passante).
Pour les webcams qui réserve plus d'USB de bande passante qu'ils ont besoin, par exemple, ceux avec note de bas de page [13] sur le Pilote UVC pagele FIX_BANDWIDTH caprice peut vous aider. Mais la bizarrerie fonctionne uniquement pour les formats non compressés (à moins que vous ne le noyau hack dans Acorn est la réponse ici). Dans mon cas (Ubuntu 14.04, de nombreux Microsoft LifeCam Cinémas à 320x240), le caprice travaillé lorsque j'ai utilisé la libv4l version d'OpenCV (quatre LifeCams sur un contrôleur asmedia USB host controller a bien fonctionné) mais pour le v4l version-qui je l'ai confirmé à utiliser MJPEG -- j'ai eu un
VIDIOC_STREAMON: No space left on device
d'erreur dès que j'ai essayé de capturer à partir d'un deuxième LifeCam! (Pour la même machine, Intel et VIA les contrôleurs hôte fait mieux et chacun a travaillé avec deux LifeCams pour v4l; la LifeCam réserves de 48% de la bande passante de l'USB 2.0.)cela fonctionne comme un charme pour moi
sudo rmmod uvcvideo
sudo modprobe uvcvideo bizarreries=128
Cela va être remis à zéro à chaque redémarrage. Si cela fonctionne, créez le fichier suivant:
sudo vi /etc/modprobe.d/uvcvideo.conf
contenant la ligne:
options uvcvideo bizarreries=128
vérifier ce lien
http://renoirsrants.blogspot.in/2011/07/multiple-webcams-on-zoneminder.html
L'un des la plupart des choses utiles que j'ai découvert était que si vous placez un Sleep(ms) appel entre votre capture d'initialisation. Cela m'a permis de récupérer deux webcam capture simultanément sans problème.