Получение кадров из видео .avi с помощью OpenCV - PullRequest
5 голосов
/ 12 февраля 2012
#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);
}

Я использую openCV с VS2008.Я прочитал видеофайл и использовал CV_CAP_PROP_FRAME_COUNT, чтобы получить количество кадров, равное приблизительно 130 для видеоклипа длиной 4 секунды.Я делаю распознавание движения при ходьбе, поэтому мне нужно получать каждые 5 кадров, поскольку между 5 кадрами движение тела практически не меняется.У меня пока есть программа, которая позволяет мне получить один кадр видеоклипа.Тем не менее, я не могу получить разные кадры, а также я не уверен, как получить каждые остальные 5 кадров.Выше приведен код, используемый для получения одного кадра видео.

1 Ответ

6 голосов
/ 12 февраля 2012

Вы должны пропустить 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;
}

Надеюсь, это поможет:)

...