2012-05-13 59 views
5

我正在使用openCV 2.2開發一個項目。我需要對AVI文件的每一幀進行處理,但是當我運行我的代碼時,它只抓取文件的第一幀。 CV_CAP_PROP_POS_FRAMES似乎沒有工作。任何想法爲什麼不呢?來自AVI的OpenCV幀捕獲

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

爲什麼不使用2.3.1或2.4? – Alex

+0

我與opencv 2.3.1 tred它和問題仍然存在。 –

回答

8

爲什麼不嘗試使用OpenCV 2.3這種方式?我認爲這是更直接,更高效,更清晰的眼睛:

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

這樣的事情應該工作。