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

我在VS2008中使用openCV。我已經讀入視頻文件,並使用CV_CAP_PROP_FRAME_COUNT獲取4秒長視頻剪輯的幀數大約爲130。我正在做一個步行的動作識別,所以我需要在5幀之間得到其他5幀,所以身體的運動幾乎沒有變化。我目前有一個節目,可以讓我獲得一段視頻剪輯。但是,我無法獲得不同的框架,而且我不知道如何去獲得其他5幀。以上是用於獲取視頻的一幀的代碼。使用OpenCV從.avi視頻獲取幀

回答

6

你應該可以跳過4幀,然後保持第5幀。下面是一個小例子,我寫證明這一點:

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

希望幫助:)

+0

感謝您的幫助。如果我看起來很傻,請原諒我,但我對OpenCV相當陌生。當你的代碼運行時,視頻剪輯以更快的速度運行,當然,這可以通過調整延遲時間從100等來改變。然而,是否有一種方法可以簡單地獲取視頻中的1/5幀?例如,代碼的輸出將是一個框架,顯示處於中間移動狀態的人員。但是迄今爲止,非常感謝你的幫助。 – 2012-02-12 06:46:00

+1

那麼,你問你是否可以尋找框架X,其中X可以是從1到5的任何框架? – mevatron 2012-02-20 21:02:21

+0

我能夠提取非常1幀5幀。感謝您的幫助:)我現在正嘗試在視頻中創建遮罩圖像或複製幀的圖像。我想上傳這兩張圖片,告訴你我正在努力完成什麼,但是我還沒有10個聲望:/你還能夠告訴我哪些openCV函數可以使用? – 2012-02-21 00:10:22