2012-02-12 43 views
5
#include "cv.h" 
#include "highgui.h" 
int main(int argc, char** argv) 
{ 
CvCapture* capture=0; 
IplImage* frame=0; 

capture = cvCaptureFromAVI("C:\\boy walking back.avi"); // read AVI video 
if(!capture) 
    throw "Error when reading steam_avi"; 

cvNamedWindow("w", 1); 

for(; ;) 
{ 
/* int cvGrabFrame (CvCapture* capture); 
    IplImage* cvRetrieveFrame (CvCapture* capture)*/ 
    frame = cvQueryFrame(capture); 
if(!frame) 
     break; 
    cvShowImage("w", frame); 

} 
cvWaitKey(0); // key press to close window 
cvDestroyWindow("w"); 
cvReleaseImage(&frame); 
} 

Estoy usando openCV con VS2008. He leído en un archivo de video y usé CV_CAP_PROP_FRAME_COUNT para obtener la cantidad de fotogramas que era aproximadamente 130 para un video de 4 segundos de duración. Estoy haciendo un reconocimiento de movimiento de caminar, así que necesito obtener otros 5 fotogramas, ya que entre 5 fotogramas, hay poco cambio en el movimiento del cuerpo. Tengo un programa hasta ahora que me permite obtener un fotograma del video clip. Sin embargo, no puedo obtener marcos diferentes y tampoco estoy seguro de cómo conseguir los otros 5 marcos. Lo anterior es el código utilizado para obtener un fotograma del video.Obteniendo fotogramas de video .avi usando OpenCV

Respuesta

6

Debería poder omitir 4 cuadros, y luego mantener el 5to cuadro. A continuación se muestra un pequeño ejemplo que escribí para demostrar esto:

IplImage* skipNFrames(CvCapture* capture, int n) 
{ 
    for(int i = 0; i < n; ++i) 
    { 
     if(cvQueryFrame(capture) == NULL) 
     { 
      return NULL; 
     } 
    } 

    return cvQueryFrame(capture); 
} 


int main(int argc, char* argv[]) 
{ 
    CvCapture* capture = cvCaptureFromFile("../opencv-root/samples/c/tree.avi"); 

    IplImage* frame = NULL; 
    do 
    { 
     frame = skipNFrames(capture, 4); 
     cvNamedWindow("frame", CV_WINDOW_AUTOSIZE); 
     cvShowImage("frame", frame); 
     cvWaitKey(100); 
    } while(frame != NULL); 

    cvReleaseCapture(&capture); 
    cvDestroyWindow("frame"); 
    cvReleaseImage(&frame); 

    return 0; 
} 

Espero que ayude :)

+0

Gracias por su ayuda. Perdónenme si parezco tonto, pero soy bastante nuevo en OpenCV. Cuando se ejecutó su código, el video se ejecutó a una velocidad más rápida, que por supuesto, podría modificarse ajustando el tiempo de la demora desde 100, etc. Sin embargo, ¿hay alguna manera de obtener simplemente 1 en 5 cuadros del video? Por ejemplo, la salida del código será un cuadro que muestra a la persona en medio del movimiento. Pero muchas gracias por su ayuda hasta el momento. –

+1

Entonces, ¿está preguntando si puede buscar encuadrar X, donde X puede ser cualquier fotograma de 1 a 5? – mevatron

+0

pude extraer muy 1 en 5 cuadros. Gracias por su ayuda :) Ahora estoy tratando de crear una imagen de máscara o una imagen copiada de un cuadro en el video. Quiero subir las 2 imágenes para mostrarle lo que estoy tratando de lograr, pero aún no tengo una reputación de 10:/¿Todavía podría recomendarme qué funciones de OpenCV usar? –

Cuestiones relacionadas