Nicht für das Lesen von frames aus Videoergreifung von sekundären webcam mit OpenCV
Code:
Einfaches Beispiel, das funktioniert perfekt mit primären webcam - (Gerät 0):
VideoCapture cap(0);
if (!cap.isOpened()) {
std::cout << "Unable to read stream from specified device." << std::endl;
return;
}
while (true)
{
//retrieve the frame:
Mat frame;
if (!cap.read(frame)) {
std::cout << "Unable to retrieve frame from video stream." << std::endl;
break;
}
//display it:
imshow("MyVideo", frame);
//check if Esc has been pressed:
if (waitKey(1) == 27) {
break;
}
//else continue:
}
cap.release();
Problem:
Habe ich eine zweite webcam, die ich gerne verwenden würde. Allerdings, wenn ich ersetzen VideoCapture cap(0);
mit VideoCapture cap(1);
, der stream wird korrekt geöffnet (oder zumindest cap.isOpened()
zurück true
) aber die cap.read(frame)
rufen Sie zurück false
und ich bin nicht in der Lage, um herauszufinden, warum.
, Was ich versucht habe:
-
Ich habe versucht, zu spielen mit
VideoCapture
's Einstellungen ein bisschen wie aufrufen von:cap.set(CV_CAP_PROP_FORMAT, CV_8UC3);
- und random-Zeug, aber nichts scheint zu helfen.
-
Habe ich auch gefunden: Videoergreifung::Lesen, schlägt fehl, Unkomprimiertes video (Bug #2281), das scheint gelöst zu sein auf die version 2.4.7.. aber ich habe soeben OpenCV, um 2.4.8, und es funktioniert immer noch nicht...
-
Ich habe versucht, zu verwenden der AMCap, um capture die raw-video von dieser Kamera, speichern Sie es als
aaa.avi
- Datei und konstruiertVideoCapture
durch aufrufen:VideoCapture cap("aaa.avi");
und es funktioniert (beim Lesen aus Datei)... was ich brauche ist die Verarbeitung in Echtzeit mit live-view aber.
HW, OS, SW details:
Meine HW: HP ProBook 4510s mit eingebauter webcam, die immer perfekt funktioniert
+ externe webcam CANYON CNR-FWCII3, verwiesen vom Betriebssystem als "USB Video Device" (das lästige ein)
OS, SW: Windows 8.1 Pro x86, Visual Studio 2012 Pro, OpenCV 2.4.8 ~ mit vc11 bauen
Fragen:
- Bin ich etwas fehlt?
- Gibt es sonst noch etwas, dass ich tun könnte?
- Gibt es zumindest irgendeine Möglichkeit, wie man abrufen, einige zusätzliche Informationen über das, was könnte das problem sein?
... OpenCV API scheint ziemlich schlecht in diesem Fall und überall dort, wo die Menschen Schienen vor dem ähnlichen Problem, da war jemand behaupten, dass es "OS /HW depnendant" als Ausrede.
Jede Hilfe wird geschätzt.
- Sind Sie sicher, dass nichts ist derzeit mit Gerät 1, wenn Sie versuchen zu Lesen? Vielleicht eines noch Laufenden vorherigen Instanz des Programms? (Klingt dumm, aber es ist mir passiert!)
- Ja, da bin ich sicher. Die Sache ist... statt zu raten, mögliche Ursachen, es wäre schön, wenn es einen Weg gibt, wie man mehr info aus ihm heraus.
- Sie nennen konnte, cap.get(i), und drucken Sie die verschiedenen Eigenschaften. Das würde Ihnen einige info siehe hier
- Aus Neugier habe ich versucht, ob
read
schlägt immer fehl und ich fand heraus, dass es ist nur der erste Anruf, dass nicht -_- - Interessant, vielleicht ist es das timing basiert? Wie in der Kamera ist nicht aufnahmebereit für ein paar ms? Was passiert, wenn Sie schlafen oder in einer Schleife durch ein großes array vor dem ersten erfassen?
- Ja, du hast Recht. Zu schlafen, den aktuellen thread für 1 sec direkt nach der
VideoCapture
konstruiert wird, ergibt die gleiche, es funktioniert. - gut zu wissen! eine der vielen Macken von opencv denke ich
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach einiger Zeit habe ich herausgefunden, dass es immer nur der erste Aufruf von
read
fehl und überspringen den ersten frame angefangen zu arbeiten in Ordnung, obwohl der wahre Grund für dieses Verhalten ist unbekannt geblieben.Später James Barnett (siehe Kommentare oben) hat darauf hingewiesen, dass der Grund könnte sein, dass es eine Weile dauert, bis die Kamera bereitet sich für die Aufnahme und das meine aktuelle Lösung sieht folgender Weise (C++11 Schlaf):
Hoffentlich einige zukünftige Besucher finden es hilfreich 🙂
einfachste Weise zu lösen, ist zu Lesen, einmal vor der Prüfung für den Erfolg. Dieses code-snippet funktioniert bei mir.
//
//
...
cap.read
rufen Sie im ursprünglichen code trotzdem hat es nicht gereicht in meinem Fall. Ich denke, das könnte hardware / Umgebung.