Ich benutze OpenCV 3. Das Ergreifen eines Frames mit VideoCapture mit einer IP-Kamera blockiert, wenn die Kamera vom Netzwerk getrennt wird oder ein Problem mit einem Frame auftritt. Ich überprüfe zuerst, ob videoCapture.isOpened()
. Wenn ja, habe ich versucht, diese Methoden aber nichts scheint zu funktionieren:C++ blockiert plötzlich beim Lesen eines Frames von der IP-Kamera mit VideoCapture
1) Grabber >> Rahmen
if(grabber.isOpened()) {
grabber >> frame;
// DO SOMETHING WITH FRAME
}
2) lesen
if(grabber.isOpened()) {
if(!grabber.grab()){
cout << "failed to grab from camera" << endl;
} else {
if (grabber.retrieve(frame,0)){
// DO SOMETHING WITH FRAME
} else {
// SHOW ERROR
}
}
}
3) greifen/abrufen
if(grabber.isOpened()) {
if (!grabber.read(frame)) {
cout << "Unable to retrieve frame from video stream." << endl;
}
else {
// DO SOMETHING WITH FRAME
}
}
Der Video-Stream bleibt an irgendeinem Punkt stecken und nimmt einen Frame mit allen vorherigen Optionen auf, wobei jeder einzelne blockiert, aber nicht beendet wird oder einen Fehler zurückgibt.
Wissen Sie, ob es eine Möglichkeit gibt, dies zu handhaben oder zu lösen? Vielleicht ein paar Validierungen, Versuch/Fang oder Timer?
Ein sehr gutes Beispiel für die Verwendung von Grab-Funktion finden Sie hier https://github.com/Itseez/opencv/blob/master/samples/cpp/openni_capture.cpp Stellen Sie sicher, dass Sie die notwendigen Prüfungen in jedem Schritt durchführen. Überprüfen, ob die Videoaufnahme geöffnet ist, ist gut, aber nicht genug. – Elmira
.read() ist dasselbe wie .grab gefolgt von .retrieve, also liest Ihre App einen Frame und versucht dann einen zweiten Frame zu lesen, was bedeutet, dass Sie warten müssen, bis ein neuer Frame verfügbar ist (je nach fps kann es etwas dauern ...) – Micka
@Micka Ich habe die drei Optionen getrennt versucht, alle von ihnen blockieren das Programm irgendwann ... Ich denke, ich brauche eine Art Validierung oder Wartezeit .. Irgendwelche Ideen? –