Frames von VideoCapture von sekundärer Webcam mit OpenCV können nicht gelesen werden

Lesezeit: 4 Minuten

Frames von VideoCapture von sekundarer Webcam mit OpenCV konnen nicht
Liho

Code:

Einfaches Beispiel, das perfekt mit der primären Webcam (Gerät 0) funktioniert:

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:

Ich habe eine zweite Webcam, die ich verwenden möchte. Allerdings, wenn ich ersetzen VideoCapture cap(0); mit VideoCapture cap(1);, Der Stream wird korrekt geöffnet (oder zumindest cap.isOpened() kehrt zurück true) aber die cap.read(frame) Anruf zurück false und ich kann nicht herausfinden warum.

Was ich versucht habe:

  • Ich habe versucht, mit zu spielen VideoCapture‘s Einstellungen ein bisschen wie Anrufen:

    cap.set(CV_CAP_PROP_FORMAT, CV_8UC3);
    

    und zufällige Sachen wie das, aber nichts scheint zu helfen.

  • Ich habe auch das gefunden: VideoCapture::read schlägt bei unkomprimiertem Video fehl (Bug #2281)was in Version 2.4.7 gelöst zu sein scheint … aber ich habe gerade OpenCV auf 2.4.8 aktualisiert und es funktioniert immer noch nicht …

  • Ich habe versucht, mit AMCap das Rohvideo von dieser Kamera aufzunehmen und es zu speichern unter aaa.avi Datei und konstruiert VideoCapture durch Anruf:

    VideoCapture cap("aaa.avi");
    

    und es funktioniert (während es aus der Datei gelesen wird) … was ich brauche, ist jedoch eine Echtzeitverarbeitung mit Live-Ansicht.

HW-, OS-, SW-Details:

Meine HW: HP ProBook 4510s mit eingebauter Webcam, die immer einwandfrei funktioniert
+ externe Webcam CANYON CNR-FWCII3, vom Betriebssystem als „USB-Videogerät“ bezeichnet (das problematische) Betriebssystem, SW: Windows 8.1 Pro x86, Visual Studio 2012 Pro, OpenCV 2.4.8 ~ mit vc11-Build

Fragen:

  1. Übersehe ich etwas?
  2. Gibt es noch etwas, was ich tun könnte?
  3. Gibt es zumindest eine Möglichkeit, zusätzliche Informationen darüber abzurufen, was das Problem tatsächlich sein könnte?

… Die API von OpenCV scheint in diesem Fall ziemlich schlecht zu sein, und überall, wo Leute mit ähnlichen Problemen konfrontiert zu sein schienen, gab es jemanden, der als Entschuldigung behauptete, es sei “OS / HW-abhängig”.

Jede Hilfe wird geschätzt.

  • Sind Sie sicher, dass gerade nichts Gerät 1 verwendet, wenn Sie versuchen, davon zu lesen? Vielleicht eine noch laufende vorherige Instanz Ihres Programms? (Klingt blöd, ist mir aber passiert!)

    – James Barnett

    25. Februar 2014 um 18:34 Uhr

  • @JamesBarnett: Ja, da bin ich mir sicher. Die Sache ist die … anstatt mögliche Ursachen zu erraten, wäre es schön, wenn es eine Möglichkeit gäbe, mehr Informationen daraus zu bekommen.

    – Liho

    25. Februar 2014 um 18:41 Uhr

  • Sie könnten cap.get(i) aufrufen und die verschiedenen Eigenschaften drucken. Das würde dir ein paar Infos geben siehe hier

    – James Barnett

    25. Februar 2014 um 18:47 Uhr


  • @JamesBarnett: Aus Neugier habe ich versucht, ob read schlägt immer fehl und ich habe herausgefunden, dass nur der erste Anruf fehlschlägt -_-

    – Liho

    25. Februar 2014 um 18:53 Uhr

  • Interessant, vielleicht hängt es vom Timing ab? Wie in der Kamera ist nicht bereit, für ein paar ms aufzunehmen? Was passiert, wenn Sie vor der ersten Erfassung schlafen oder ein großes Array durchlaufen?

    – James Barnett

    25. Februar 2014 um 19:00 Uhr

Frames von VideoCapture von sekundarer Webcam mit OpenCV konnen nicht
Liho

Nach einiger Zeit habe ich herausgefunden, dass es immer nur der erste Anruf ist read das schlägt fehl und das Überspringen des ersten Frames begann gut zu funktionieren, obwohl der wahre Grund für dieses Verhalten unbekannt blieb.

Später hat James Barnett (siehe Kommentare oben) darauf hingewiesen, dass der Grund dafür sein könnte, dass es eine Weile dauert, bis die Kamera zum Aufnehmen bereit ist, und meine aktuelle Lösung sieht folgendermaßen aus (C++11s Ruhezustand):

#include <chrono>
#include <thread>
...

VideoCapture cap(1);

// give camera some extra time to get ready:
std::this_thread::sleep_for(std::chrono::milliseconds(200));

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;
        continue;
    }

    // display it:
    imshow("LiveStream", frame);

    // stop if Esc has been pressed:
    if (waitKey(1) == 27) {
        break;
    }
}

cap.release();

Hoffentlich finden es einige zukünftige Besucher hilfreich 🙂

Der einfachste Weg, dies zu lösen, besteht darin, einmal zu lesen, bevor Sie auf Erfolg prüfen. Dieses Code-Snippet funktioniert bei mir. //

cap.read(frame);
if(!cap.read(frame)){

// …

  • Ich habe den Rückgabewert von überprüft cap.read Rufen Sie den Originalcode auf, aber in meinem Fall war es immer noch nicht genug. Ich denke, dies könnte hardware- / umgebungsspezifisch sein.

    – Liho

    30. Januar 2015 um 15:47 Uhr

843040cookie-checkFrames von VideoCapture von sekundärer Webcam mit OpenCV können nicht gelesen werden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy