2013-04-13 45 views
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; 
} 

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

+0

附记:因为你使用的是最新的OpenCV(2.4.4),并通过opencv.hpp一个C++ API,你应该利用这个API的充分利用,通过使用C++类而不是C结构体,即cv :: Mat而不是IplImage *,cv :: namedWindow()等。您将获得许多实际好处,例如自动内存管理。 – sansuiso

回答

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

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

+0

但如何保存这些帧,我想从程序自动保存这些帧 – Rocket

+0

这很容易。只保存具有不同名称的单个帧。 – Saikat

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); 
    
+0

+1为答案,哪个库用于Mat和imwrite?因为它显示未定义 – Rocket

+1

这些函数位于命名空间cv ::中。所以你可以使用'cv :: Mat'和'cv :: imwrite'。或者用'using namespace cv'来定义一个名字空间。 – Alexey

+2

@baban程序应该自动保存帧,我不想通过按任何按钮或任何外部使用来保存图片 – Rocket

0

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