2012-06-07 10 views

Odpowiedz

2

Spójrz na this article. Pokazuje, jak odtwarzać pliki AVI za pomocą OpenCV. Tutaj, liczba klatek na sekundę jest odczytywany za pomocą

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

a opóźnienie jest ustawiony poprzez

key = cvWaitKey(1000/fps); 

Stąd poprzez sterowanie zmienną fps można uzyskać odtwarzać stawkę chcesz.

+3

Z pewnością zakłada, że ​​odczyt/wyświetlenie ramki nie trwa długo i że cvWaitKey czeka dokładnie podaną wartość? (w dokumentach mówi, że to tylko minimum). – Tim

+0

@Tim 1. Odczyt/wyświetlenie zajmuje trochę czasu, ale aby uzyskać pożądany FPS, należy tylko zadbać o interwał (opóźnienie) pomiędzy kolejnymi odczytami (lub wyświetleniami). Ramka zostanie wyświetlona później (przez jakieś nieznane opóźnienie odczytu + wyświetlenia), ale następna klatka będzie (średnio) opóźniona o ten sam (nieznany czas) i będzie idealnie w porządku. 2. W celu uwzględnienia niedokładności opóźnienia, dostosowuje się kolejną umowę w zależności od aktualnego czasu i pożądanego czasu następnego wyświetlania. Dla FPS równej 30 spowoduje to wyświetlenie ramek, np. w momentach 0, 31, 68, 99 ms, czyli blisko ideału 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

W pętli while dodałem także przechwycenie, aby pominąć niepotrzebne klatki; tak, że niektóre ramki są pomijane –

Powiązane problemy