2012-06-07 2 views

Antwort

2

Werfen Sie einen Blick auf this article. Es zeigt, wie AVI-Dateien mit OpenCV wiedergegeben werden. Hier wird die Frame-Rate gelesen wird, mit

int fps = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FPS); 

und die Verzögerung wird über

key = cvWaitKey(1000/fps); 

Somit kann durch die fps variable Steuerung, können Sie das Spiel wieder Rate, die Sie wollen.

+3

Sicher, dass das Lesen/Anzeigen des Frames dauert keine Zeit und dass cvWaitKey genau den angegebenen Wert wartet? (In der Dokumentation heißt es, dass dies nur ein Minimum ist) – Tim

+0

@Tim 1. Das Lesen/Anzeigen dauert etwas, aber um FPS zu erreichen, sollte man sich nur um das Intervall (Verzögerung) zwischen aufeinanderfolgenden Lesevorgängen (oder Anzeigen) kümmern. Frame wird später angezeigt (durch eine unbekannte Lese- und Display-Verzögerung), aber das nächste Frame wird (im Durchschnitt) um die gleiche (unbekannte Zeit) verzögert und es ist völlig in Ordnung. 2. Um die Ungenauigkeit der Verzögerung zu berücksichtigen, wird als nächstes abhängig von der aktuellen Zeit und der gewünschten nächsten Anzeigezeit eingestellt. Bei einem FPS von 30 führt dies dazu, dass Rahmen z. zu Momenten 0, 31, 68, 99 ms, d. h. nahe am Ideal 0, 33, 67, 100 –

2
int fps = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FPS); 
int delay = 1000/fps; 

while (true) { 
    clock_t startTime = clock(); 

    capture.read(frame); 
    process(); 

    imshow("video", frame); 

    while (clock() - startTime < delay) { 
     waitKey(1); 
    } 
} 
+0

In der While-Schleife habe ich auch eine Aufnahme hinzugefügt, um die nicht notwendigen Frames zu überspringen; so dass einige Frames übersprungen werden –