2012-02-12 17 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); 
} 

Sto usando openCV con VS2008. Ho letto un file video e ho utilizzato CV_CAP_PROP_FRAME_COUNT per ottenere il numero di frame che era approssimativamente 130 per un video clip lungo 4 secondi. Sto facendo un riconoscimento del movimento di camminare quindi ho bisogno di ottenere ogni 5 fotogrammi da 5 fotogrammi, c'è un piccolo cambiamento nel movimento del corpo. Ho un programma finora che mi permette di ottenere un frame del video clip. Tuttavia, non sono in grado di ottenere diversi frame e inoltre, non sono sicuro di come ottenere gli altri 5 frame. Quanto sopra è il codice utilizzato per ottenere un frame del video.Come ottenere frame da .avi video usando OpenCV

risposta

6

Dovresti essere in grado di saltare 4 fotogrammi e quindi mantenere il quinto fotogramma. Di seguito è riportato un piccolo esempio che ho scritto per dimostrare questo:

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; 
} 

Speranza che aiuta :)

+0

Grazie per il vostro aiuto. Perdonami se sembro sciocco, ma sono abbastanza nuovo per OpenCV. Quando il codice è stato eseguito, il video clip funzionava a una velocità maggiore, che naturalmente poteva essere modificata regolando l'ora del ritardo da 100 ecc. Tuttavia, c'è un modo per ottenere semplicemente 1 fotogramma su 5 del video? Ad esempio, l'output del codice sarà una cornice che mostra la persona a metà movimento. Ma grazie mille per la tua assistenza fino ad ora. –

+1

Quindi, stai chiedendo se puoi cercare di inquadrare X, dove X può essere qualsiasi fotogramma da 1 a 5? – mevatron

+0

sono stato in grado di estrarre molto da 1 a 5 fotogrammi. Grazie per il tuo aiuto :) Sto cercando di creare un'immagine di maschera o un'immagine copiata di una cornice nel video. Voglio caricare le 2 immagini per mostrarti cosa sto cercando di realizzare ma non ho ancora una reputazione:/Saresti ancora in grado di consigliarmi quali funzioni di openCV usare? –

Problemi correlati