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 konstruiertVideoCapture
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:
- Übersehe ich etwas?
- Gibt es noch etwas, was ich tun könnte?
- 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