Die Erfassung mehrerer webcams (uvcvideo) mit OpenCV auf Linux
Ich versuche, gleichzeitig übertragen Bilder aus 3 Logitech Webcam Pro 900 Geräte mit OpenCV 2.1 auf Ubuntu 11.10. Der uvcvideo-Treiber geladen wird.
Erfassung von zwei Geräten funktioniert, jedoch mit drei, die ich laufen in der out-of-space Fehler zum Dritten:
libv4l2: error turning on stream: No space left on device
Scheine ich zu laufen in dieses Problem:
http://renoirsrants.blogspot.com.au/2011/07/multiple-webcams-on-zoneminder.html und ich haben versucht, zu tun, die Macken=128 (oder so ziemlich jede andere power-of-two-Wert) trick, aber ohne Erfolg. Ich habe auch versucht auf einem anderen Rechner mit zwei USB-2.0-hubs und Anschluss von zwei Kameras zu einem und die Dritte Kamera, die zweite, welche in Folge in das gleiche problem. Ich bin initialisieren, etwa wie folgt (mit N-Kameras, so ist doch das Ergebnis in ein STL-Vektor):
cv::VideoCapture cap0(0); //(0,1,2..)
und versucht, zu erfassen, all die Kameras, die in einer Schleife als
cap0.retrieve(frame0);
Dies funktioniert gut für N=2 Kameras. Wenn ich N=3 das Dritte Fenster öffnet sich aber es erscheint kein Bild und die Konsole ist voll gespammt V4L2-Fehler. Ebenso, wenn ich N=2, und versuchen, öffnen Sie die Dritte Kamera sagen Käse (simple webcam capture-Anwendung), diese funktioniert auch nicht.
Nun kommt das große aber: Nach dem Versuch, guvcview, indem Sie bereits drei Instanzen, dass, ich war in der Lage zu drei Kameras gleichzeitig (mit keine Probleme in Bezug auf die frame-rate oder ähnliche), so scheint es nicht zu sein, ein hardware-Problem. Ich vermute, es ist eine Eigenschaft, die ich sollte, aber ich bin mir nicht sicher, was das ist. Ich habe mir in MJPEG (das diese Kameras scheinen das zu unterstützen), aber noch nicht gelungen, in die Einstellung dieser Eigenschaft, oder zu erkennen, in welchem Modus (yuyv?) Sie läuft wenn ich Sie starten von OpenCV.
Gedanken?
InformationsquelleAutor geez | 2012-03-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte genau dieses problem, mit drei logitech quickcam pro 9000-Kameras (mit ubuntu). Ich Lesen konnte, aus zwei, aber nicht drei. In meinem Fall war ich nicht mit opencv, aber war der Zugriff auf die Kameras durch den V4L2-direkt, per memory-mapped IO. Einfach ausgedrückt, es war nicht genug USB-Bandbreite drei Puffer.
Las ich in der unkomprimierten frames, jedoch. Sobald ich wechselte das format MJPEG, werden die Daten klein genug, und ich konnte Lesen, von den drei Kameras. Ich libjpeg verwendet zum decodieren der MJPEG stream.
Ich habe nicht geschaut in wie ändern Sie das image-format mit OpenCV, aber ich weiß, dass es sein muss, MJPEG-passend für alle Daten.
Bevor ich umgestiegen, MJPEG, ich verbrachte eine Menge Zeit versucht, Zugriff auf jede Kamera, die ein zu einer Zeit, streaming single-frame vor dem Wechsel auf den nächsten. Nicht empfehlenswert!!!
InformationsquelleAutor mnajera
Ich hatte auch dieses problem und haben eine Lösung, die mir erlaubt, capture 2 Kameras mit 640x480 mit mjpeg-Kompression. Ich bin mit einem Kreativen "Live Cam Sync HD VF0770" fälschlicherweise berichtet, dass der Bedarf an Bandbreite. Die Macken=128 fix funktioniert für 320x240 Unkomprimiertes video. Aber für komprimierten (mjpg) - format die Macken=128 nicht funktioniert (es tut nichts für komprimierte Formate).
Um dies zu beheben habe ich geändert, der uvc-Treiber wie folgt:
laden Sie die kernel-Quellen
kopieren uvc dir:
ändern Makefile
Kraft Bandbreite auf 0 x 400 komprimiert.
bauen die aauvcvideo Modul:
entfernen Sie die alte Modul, und fügen Sie neue:
laufen gucview zweimal mit Kompression in 2 verschiedenen windows zu testen
Glück!
-Eichel
v4l2-ctl -d 0 -V
behauptete Pixel Format 'MJPG', während ich verwendet OpenCV-basierten code zur Aufnahme von mehreren Kameras.Herausgefunden, warum die Laune bei mir geklappt, siehe meine Antwort hier. In einer nussschale, OpenCV wurde die Erfassung unkomprimierter ungeachtet was
v4l2-ctl -d 0 -V
behauptet.Vielen Dank für diese. Hinzufügen von ein paar mehr Teile von Informationen, hier ist genau, wie ich Tat dies auf einem debian-basierten Gerät: # apt-get source linux-image # tar xf <Datei> # cd linux-image # cp /lib/modules/<entsprechende dir>/build/Module.symvers . # make oldconfig # make prepare # make scripts # [BEARBEITEN WIE OBEN in drivers/media/usb - /uvc-Strahlen] # UNTERVERZEICHNISSE=drivers/media/usb/uvc/ Module
InformationsquelleAutor Acorn
Wahrscheinlich ist die USB-Bandbreite Streit berichtet vom Treiber der video-capture-Gerät. Überprüfen Sie, ob das pixel-format ist YUYV,, die passiert werden dekomprimiert. Im Gegenteil, wenn das pixel format ist MJPG (komprimiert), es ist möglich, mehrere Geräte am gleichen USB-Kanal.
Die Ausgabe wäre etwas wie folgt:
Im folgenden sind die möglichen Lösungen:
InformationsquelleAutor sudar
OpenCV erstellt werden kann, verwenden Sie entweder v4l oder von libv4l, und nur die v4l-version unterstützt komprimierte Formate, während die von libv4l-version unterstützt nur ein Unkomprimiertes format für OpenCV 2.4.11. (Siehe autosetup_capture_mode_v4l2() für v4l und der folgende code Linie 692 für von libv4l.) OpenCV 3.0.0 nicht verbessern, viel über 2.4.11 hier; es unterstützt nur unkomprimierte Formate für die von libv4l.
Da Ihre Fehler erwähnt
libv4l2
Sie zu haben scheinen, die von libv4l-version und OpenCV erfasst unkomprimiert in Ihrem Fall. Sie bauen ein v4l-version von OpenCV, Ihre cmake-Befehl enthalten sollte(
WITH_LIBV4L
war standardmäßig aktiviert, für mich.)Einen Hinweis auf die Bandbreite und USB. USB 2.0 (mit dem nahezu alle webcams verwenden) hat eine Bandbreite von 480 Mbit/s. 640 x 480 bei 30 fps und 24 bit/pixel unkomprimiert ist über 221 Mbit/s, so kann man zu USB 2.0-Bandbreite schnell mit unkomprimierten webcams. Man erhält 480 Mbit/s für jeden USB - host controller finden Sie in diesem Antwort, wie Sie Liste. (USB - hubs nicht fügen Sie die host-Controller und mehrere USB-ports auf einem motherboard sind in der Regel verbunden, um die gleiche host-controller. Alle Geräte und hubs angeschlossen an einen host-controller teilen sich die Bandbreite).
Für webcams, die reserve mehr USB-Bandbreite, als Sie brauchen, z.B. diejenigen, die mit Fußnote [13] auf die UVC-Treiber Seite, die FIX_BANDWIDTH Macke helfen können. Aber die Sache funktioniert nur bei unkomprimierten Formaten (es sei denn, Sie tun das kernel-hack in der Eichel ist die Antwort hier). In meinem Fall (Ubuntu 14.04, viele Microsoft-LifeCam-Kinos bei 320x240), die Eigenart gearbeitet, wenn ich von libv4l-version von OpenCV (vier-LifeCams auf einem ASMedia USB host controller gut funktioniert), aber für die v4l-version-was ich bestätigt zu verwenden MJPEG-ich habe eine
VIDIOC_STREAMON: No space left on device
Fehlermeldung, sobald ich versuchte, Sie zu erfassen, aus einer zweiten LifeCam! (Für die gleiche Maschine, Intel und VIA-host-Controller besser, und jeder arbeitete mit zwei LifeCams für v4l; die LifeCam behält sich 48% der USB 2.0-Bandbreite).InformationsquelleAutor Ulrich Stern
dies funktioniert wie Charme für mich
sudo rmmod uvcvideo
sudo modprobe uvcvideo Macken=128
Dieser wird zurückgesetzt bei jedem Neustart. Wenn dies funktioniert, erstellen Sie die folgende Datei:
sudo vi /etc/modprobe.d/uvcvideo.conf
mit der Zeile:
Optionen uvcvideo Macken=128
überprüfen Sie diesen link
http://renoirsrants.blogspot.in/2011/07/multiple-webcams-on-zoneminder.html
InformationsquelleAutor Satyendra Sahani
Eines der hilfreichsten Dinge, die ich entdeckte, war, wenn Sie ein Sleep(ms) - Aufruf zwischen Ihre capture-Initialisierungen. Dies erlaubte mir zum abrufen von zwei webcam gleichzeitig erfasst, ohne problem.
InformationsquelleAutor Rod Dockter
Mit kernel 4.15.0-34-generic Ubuntu 18.04 und OpenCV 3.4 kompiliert mit gstreamer/v4l-Unterstützung, die ich in der Lage bin zu streamen 3x720p auf einem einzigen USB-port mit einem aktiven hub mit MJPG-Kompression mit gstreamer-python (mit 2xC922 und 1xC920 Kameras - die 10fps framerate ist nicht notwendig, für diese zu arbeiten):
InformationsquelleAutor Gabe