从视频中获取帧

时间:2013-04-13 09:37:53

标签: visual-c++ opencv image-processing

#include "opencv2/opencv.hpp"
#pragma comment (lib , "opencv_core244d.lib")
#pragma comment (lib ,"opencv_highgui244d.lib")
#pragma comment(lib , "opencv_imgproc244d.lib")
int main(int argc, char* argv[])
{
    CvCapture* capture = cvCaptureFromFile("try.avi");

    IplImage* frame = NULL;
    do
    {
        frame = skipNFrames(capture, 1);
        cvNamedWindow("frame", CV_WINDOW_AUTOSIZE);
        cvShowImage("frame", frame);
        cvWaitKey(0);
    } while( frame != NULL );

    cvReleaseCapture(&capture);
    cvDestroyWindow("frame");
    cvReleaseImage(&frame);

    return 0;
}

这是我从视频中获取帧的程序,但是当我运行此程序时,它可以工作,它会显示视频,但它不会自动保存帧(不使用任何按钮或鼠标),这应保存在我的目录

4 个答案:

答案 0 :(得分:3)

要查看视频的每个帧,请分别使用cvWaitKey(0)。它显示视频的当前帧并等待无限按键。所以要看下一帧按键。

答案 1 :(得分:3)

单独保存每个帧,

  1. #include<stdio.h>

  2. 声明全局变量

    int flag=0;

  3. 将以下代码添加到 cvWaitKey(0)

    char *str=new char[50];
    
    flag++;
    sprintf(str,"%d",flag);
    strcat(str," frame");
    strcat(str,".jpg");
    Mat image=frame;
    imwrite(str,image);
    

答案 2 :(得分:2)

#include"stdafx.h"
#include<cv.h>
#include<highgui.h>
#include<cxcore.h>


int main(int argc, char* argv[]) {

int c=1;
IplImage* img=0;
char buffer[1000];
CvCapture* cv_cap = cvCaptureFromFile("try.avi");
cvNamedWindow("Video",CV_WINDOW_AUTOSIZE);
while(1) {

img=cvQueryFrame(cv_cap);
cvShowImage("Video",img);
sprintf(buffer,"D:/image%u.jpg",c);
cvSaveImage(buffer,img);
c++;
  if (cvWaitKey(100)== 27) break;
}

cvDestroyWindow("Video"); 
return 0;
}

试试这个,这将有效

答案 3 :(得分:0)

您需要使用cvSaveImage()明确保存每个框架 这应该在您的循环中完成,无论您想要保存框架 显然,如果要使用不同的名称保存每个帧,则必须为每个调用生成不同的名称。 @baban展示了一种方法。