2012-05-13 15 views
5

Ich arbeite an einem Projekt mit openCV 2.2. Ich muss für jeden Frame einer AVI-Datei verarbeiten, aber wenn ich meinen Code ausführe, wird nur der erste Frame der Datei gegriffen. Die CV_CAP_PROP_POS_FRAMES scheint nicht zu funktionieren. Irgendwelche Ideen warum nicht?OpenCV Frame Capture von 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

Warum verwenden Sie nicht 2.3.1 oder 2.4? – Alex

+0

Ich habe es mit opencv 2.3.1 versucht und das Problem besteht immer noch. –

Antwort

8

Warum versuchen Sie diesen Weg nicht mit OpenCV 2.3? Ich denke, es ist direkter und effiziente und klar in den Augen:

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

So etwas wie dies funktionieren soll.