video - read - OpenCV Seek Function/Rewind
record video opencv (3)
Creo que tendrías que leer todo el archivo en una matriz de IplImages, luego trabajar en eso. La razón es que cvQueryFrame es un proceso unidireccional, lee un cuadro por vez en orden. No puedo pensar de otra manera. Dependiendo de la duración del video, el tiempo de inicialización puede no ser tan malo.
Los cvTrackbars son como usted dice, principalmente utilizados para modificar parámetros. Alteran el valor de una variable (dado como un parámetro en forma de puntero) y lanzan una función de devolución de llamada. Desafortunadamente, son los únicos elementos de estilo botón en HighGUI, por lo que sé
He estado intentando encontrar / implementar una función de búsqueda y rebobinado (para video (.avi)) usando OpenCV en C ++, pero no puedo encontrar una manera de hacerlo, que no sea recorrer el archivo completo una sola vez y guardar cada imagen. ¿Hay alguna otra manera?
Cualquier ayuda sería muy apreciada; Gracias de antemano!
En la biblioteca de highgui encontrarás funciones para una barra de búsqueda (cvCreateTrackbar y amigos).
Al usar cvSetCaptureProperty (), puede alternar entre fotogramas, en milisegundos o por número de fotograma ordinal.
int cvSetCaptureProperty( CvCapture* capture, int property_id, double value );
property_id es una propiedad que necesitarías usar. Puede ser uno de los siguientes:
- CV_CAP_PROP_POS_MSEC - posición en milisegundos desde el comienzo del archivo
- CV_CAP_PROP_POS_FRAMES - posición en marcos
- CV_CAP_PROP_POS_AVI_RATIO - posición en unidades relativas (0 - inicio del archivo, 1 - fin del archivo)
- CV_CAP_PROP_FRAME_WIDTH: ancho de fotogramas en la transmisión de video (solo para cámaras)
- CV_CAP_PROP_FRAME_HEIGHT - altura de fotogramas en la secuencia de video (solo para cámaras)
- CV_CAP_PROP_FPS - velocidad de fotogramas (solo para cámaras)
- CV_CAP_PROP_FOURCC - Código de códec de 4 caracteres (solo para cámaras).
Los primeros dos son de su interés.
EDITAR: más información :)
Puede alternar entre fotogramas simplemente llamando repetidamente a la función mencionada con varios índices de fotogramas.
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);
}
Podría poner código similar para ejecutar cada vez que el usuario haga clic en un botón para reenviar / rebobinar el video.
El método de C ++ (OpenCV 2 y superior) sería usar este método con el mismo valor de propiedad y valor.
bool VideoCapture::set(int property_id, double value)