2012-02-12 2 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 번에서부터 지연 시간을 조정하여 비디오 클립을 변경할 수 있습니다. 그러나 비디오의 5 프레임 중 1 프레임을 얻는 방법이 있습니까? 예를 들어, 코드의 출력은 사람의 움직임을 보여주는 프레임이됩니다. 지금까지 귀하의 도움에 너무 감사드립니다. –

+1

그럼 X 프레임을 찾을 수 있는지 묻고 있습니까? X는 1에서 5까지의 프레임이 될 수 있습니까? – mevatron

+0

5 프레임 중 아주 1 프레임을 추출 할 수있었습니다. 도와 주셔서 감사합니다 :) 이제 마스크 이미지를 만들거나 비디오의 프레임 이미지를 복사하려고합니다. 내가 뭘 하려는지 보여주기 위해 2 개의 이미지를 업로드하고 싶지만 아직 명성이 10 가지가 아닙니다 :/사용할 openCV 기능에 대해 계속 알려 주실 수 있습니까? –