2012-06-07 21 views

Respuesta

2

Eche un vistazo a this article. Muestra cómo reproducir archivos AVI con OpenCV. En este caso, la velocidad de fotogramas se lee usando

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

y el retardo se ajusta a través

key = cvWaitKey(1000/fps); 

Por lo tanto, mediante el control de la variable fps, se puede obtener la tasa de reproducción que desee.

+3

Seguramente eso supone que la lectura/visualización del marco no toma tiempo y que cvWaitKey espera exactamente el valor especificado? (en los documentos dice que es solo un mínimo) – Tim

+0

@Tim 1. La lectura/visualización lleva algo de tiempo, pero para obtener el FPS deseado, solo debe tenerse en cuenta el intervalo (retardo) entre lecturas consecutivas (o pantallas). El recuadro se mostrará más tarde (por algún retraso desconocido de lectura + visualización), pero el siguiente fotograma (en promedio) se retrasará por el mismo (cantidad desconocida de tiempo) y está perfectamente bien. 2. Para tener en cuenta la inexactitud del retardo, uno ajusta el acuerdo siguiente dependiendo de la hora actual y el tiempo de visualización siguiente deseado. Para FPS de 30, esto dará como resultado que se muestren marcos, p. en los momentos 0, 31, 68, 99 ms, es decir, cerca del 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

En el ciclo while agregué también una captura para omitir los fotogramas innecesarios; por lo que algunos marcos se saltan –

Cuestiones relacionadas