2012-05-13 20 views
5

Sto lavorando a un progetto con openCV 2.2. Ho bisogno di fare l'elaborazione su ogni frame di un file AVI, ma quando eseguo il mio codice si aggrappa solo al primo fotogramma del file. CV_CAP_PROP_POS_FRAMES non sembra funzionare. Qualche idea, perché no?Acquisizione frame OpenCV da AVI

CvCapture* capture = cvCaptureFromAVI("test1.avi"); 

    IplImage *img = 0; 

    if (!cvGrabFrame(capture)) { 
      printf("Error: Couldn't open the image file.\n"); 
      return 1; 
    } 

    int numFrames = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT); 
    int posFrame = 1; 
    for(int i =0; i <= numFrames; i++){ 
     cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, i); 
       posFrame = cvGetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES); 

       img = cvGrabFrame(capture); 
       cvNamedWindow("Image:", CV_WINDOW_AUTOSIZE); 
       cvShowImage("Image:", img); 
       printf("%i\n",posFrame); 

       cvWaitKey(0); 

       cvDestroyWindow("Image:"); 
    } 
+0

Perché non usi 2.3.1 o 2.4? – Alex

+0

L'ho provato con opencv 2.3.1 e il problema esiste ancora. –

risposta

8

Perché non provare in questo modo utilizzando OpenCV 2.3? Penso che sia più diretto ed efficiente e più chiaro ai tuoi occhi:

VideoCapture _videoSource; 

if(!_videoSource.open("test1.avi")) 
{ 
    exit(1);   // Exit if fail 
} 
_videoSource.set(CV_CAP_PROP_CONVERT_RGB, 1); 

Mat frame; 
namedWindow("Image"); 
int posFrame; 

while(1) 
{ 
    _videoSource >> frame; 
    posFrame=_videoSource.get(CV_CAP_PROP_POS_FRAMES); 
    imshow("output", frame); 
    return 0; 
} 

Qualcosa del genere dovrebbe funzionare.