3
#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

4 回答 4

4

要单独查看视频的每一帧,请使用cvWaitKey(0). 它显示视频的当前帧并无限等待按键。因此,要查看下一帧,请按一个键。

于 2013-04-13T13:22:28.563 回答
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);
    
于 2013-04-19T16:35:46.793 回答
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;
}

试试这个,这会奏效

于 2013-04-25T15:48:15.633 回答
0

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

于 2013-04-25T08:38:35.870 回答