2016-04-20 28 views
1

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?

+1

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

+1

.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

+0

@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? –

Antwort

2

Dieses Problem wurde von this merge gelöst, aber unglücklicherweise opencv_ffmpeg.dll ist noch nicht veröffentlicht.

finden Sie here aktualisiert opencv_ffmpeg.dll und testen.

+0

Danke für Ihre Hilfe! Ich werde es mir ansehen. Die Sache ist, dass ich auf Linux bin, irgendwelche Gedanken dazu? –

+1

Wenn Sie Kommentare [hier] lesen (https://github.com/Itseez/opencv/pull/6053), werden Sie meinen Kommentar sehen, wie man opencv_ffmpeg.dll für Windows aktualisiert. Du könntest dort fragen, wie es mit Linux aussieht. – sturkmen

+0

UPDATE: Ich fragte und mir wurde gesagt "Es gibt keine separate opencv_ffmpeg.dll unter Linux. Um ffmpeg Unterstützung in OpenCV zu aktivieren, müssen Sie ffmpeg Entwicklungspakete installieren (-dev/-devel, hängt von der Linux Distribution ab) und OpenCV CMake erneut ausführen" –