从视频中获取帧

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

这是我获取视频帧的程序,但是当我运行这个程序时,它可以正常工作并显示视频,但是它没有自动保存帧(不使用任何按钮或鼠标),而这些帧应该保存在我的目录中。


额外的说明:由于您正在使用最近的OpenCV(2.4.4)和通过opencv.hpp的C++ API,因此您应该充分利用这个API,使用C++类而不是C结构,即使用cv::Mat代替IplImage *,使用cv::namedWindow()等。您将获得许多实际好处,如自动内存管理。 - sansuiso
4个回答

4

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


但是如何保存这些帧并且我想让程序自动保存这些帧。 - Rocket
非常简单,只需使用不同的名称保存每个帧。 - Saikat

3
为了单独保存每个帧,
  1. #include<stdio.h>

  2. Declare a global variable

    int flag=0;

  3. add following code just below to cvWaitKey(0) :

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

+1 为答案,Mat 和 imwrite 使用哪个库?因为它显示未定义。 - Rocket
1
这些函数位于命名空间cv::中。因此,您可以将它们与cv::Matcv::imwrite一起使用。或者使用using namespace cv定义一个命名空间。 - Alexey
2
@baban程序应该自动保存帧,我不想通过按任何按钮或任何外部使用来保存图片。 - Rocket

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

试试这个,它会起作用的


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接