2012-06-07 1 views

risposta

2

Dai uno sguardo allo this article. Mostra come riprodurre i file AVI con OpenCV. Qui, il frame rate viene letto utilizzando

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

e il ritardo viene impostato tramite

key = cvWaitKey(1000/fps); 

Quindi, controllando la variabile fps, è possibile ottenere il gioco di nuovo tasso che si desidera.

+3

Sicuramente questo presuppone che la lettura/visualizzazione del frame non richieda tempo e che cvWaitKey aspetti esattamente il valore specificato? (nei documenti si dice che è solo un minimo) – Tim

+0

@Tim 1. La lettura/visualizzazione richiede un po 'di tempo, ma per avere l'FPS desiderato si dovrebbe solo preoccuparsi dell'intervallo (ritardo) tra letture consecutive (o display). La cornice verrà visualizzata in un secondo momento (con qualche lettura sconosciuta + ritardo di visualizzazione), ma il fotogramma successivo sarà (in media) ritardato dallo stesso (quantità di tempo sconosciuta) ed è perfettamente a posto. 2. Per tenere conto di inesattezza del ritardo, si regola il prossimo tempo in base all'ora corrente e alla successiva visualizzazione del tempo desiderato. Per FPS di 30 ciò comporterà la visualizzazione di frame, ad es. nei momenti 0, 31, 68, 99 ms cioè vicino all'ideale 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

Nel ciclo while ho aggiunto anche una cattura per saltare i fotogrammi non necessari; in modo che alcuni fotogrammi vengano saltati –