Usando cvSetCaptureProperty() puede alternar entre fotogramas, ya sea en milisegundos o por número de fotograma ordinal.
int cvSetCaptureProperty(CvCapture* capture, int property_id, double value);
property_id es una propiedad que tendría que utilizar. Puede ser uno de los siguientes:
- CV_CAP_PROP_POS_MSEC - posición en milisegundos desde el archivo comenzando
- CV_CAP_PROP_POS_FRAMES - posición en marcos
- CV_CAP_PROP_POS_AVI_RATIO - posición en unidades relativas (0 - inicio de la archivo, 1 - final del archivo)
- CV_CAP_PROP_FRAME_WIDTH - ancho de fotogramas de la secuencia de vídeo (sólo para cámaras)
- CV_CAP_PROP_FRAME_HEIGHT - hei lucha de fotogramas de la secuencia de vídeo (sólo para cámaras)
- CV_CAP_PROP_FPS - velocidad de cuadro (sólo para cámaras)
- CV_CAP_PROP_FOURCC - código de 4 caracteres de códec (sólo para cámaras).
Los dos primeros son de su interés.
EDIT: más información :)
Puede desplazarse a través de los marcos con sólo llamar repetidamente la función mencionada con diferentes índices de marco.
cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, frameIndex);
Ejemplo:
IplImage* frame;
CvCapture* capture = cvCreateFileCapture("test.avi");
/* iterate through first 10 frames */
for (int i = 0; i < 10; i++)
{
/* set pointer to frame index i */
cvSetCaptureProperty(capture, CV_CAP_POS_FRAMES, i);
/* capture the frame and do sth with it */
frame = cvQueryFrame(capture);
}
Se puede poner un código similar para ejecutar cada vez que el usuario hace clic en un botón para avanzar/retroceder el video.
El método C++ (OpenCV 2 y superior) sería utilizar este método en su lugar con el mismo property_id y valor.
bool VideoCapture::set(int property_id, double value)
Por cierto, como punta, la búsqueda de OpenCV no funciona correctamente en flv si te quedas atascado cada vez que buscar no funcionó. Me llevó un día para resolverlo! –