如何从视频中保存下一帧和当前帧

时间:2013-05-06 14:38:37

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

我想从同一视频的current帧中减去previous视频帧,并为所有视频做同样的事情而不是write those frame as seprate video,我在保存当前帧和下一帧。如何保存它们,以便在下一帧到来时它成为下一帧的前一个

    IplImage* skipNFrames(CvCapture* capture, int n)
{

    for(int i = 0; i < n; ++i)
    {
        if(cvQueryFrame(capture) == NULL)
        {
            return NULL;
        }
    else
    {

        char* New_image;
     // New_image* =  cvQueryFrame(capture) - cvCloneImage(capture);
Mat current_frame;
Mat previous_frame;

if (!capture.isOpened()) {
    return -1;
}

while(1)
{
    capture >> current_frame;
    if (current_frame.empty())
        break;
    // do video processing

    imshow("Window", current_frame);
    waitKey(10);
    frame = skipNFrames(capture, 1)
    frame.copyTo(previous_frame); 

      int frame_width=(int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);     
      int frame_height=(int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);   
      int fps = ( int )cvGetCaptureProperty( capture, CV_CAP_PROP_FPS ); 
   //creating video writer structure
     CvVideoWriter *writer = 0;
     writer=cvCreateVideoWriter("savedVideo.avi",CV_FOURCC('M', 'P', '4', '2'),fps,cvSize(frame_width,frame_height),1);

     if( !writer ) {
   //release memory
       cvReleaseCapture( &capture );
       return 0;
      }

    while(true) {
             //grab and retrieve each frames of the video sequentially 
             IplImage* frame = cvQueryFrame( New_image );
             if( !frame ) break;

       //writing frame by frame to the output file 
      cvWriteFrame(writer,frame);
   }


    cvReleaseVideoWriter(&writer);
    cvReleaseCapture( &capture );

    return 0;
}

    }
     // return cvNew_image      
    //return cvQueryFrame(capture);
} 
int main(int argc, char* argv[])
{
    CvCapture* capture = cvCaptureFromFile("try.avi");
    char buffer[1000];
    int flag=0;
    IplImage* frame = NULL;
    do
    {
        //frame = skipNFrames(capture, 1);
        cvNamedWindow("frame", CV_WINDOW_AUTOSIZE);
        cvShowImage("frame", frame);
        cvWaitKey(0);
        char *str=new char[50];
        flag++;
        sprintf(str,"%d",flag);
        strcat(str," frame");
        strcat(str,".png");
        Mat image=frame;
        imwrite(str,image);
    } while( frame != NULL );

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

    return 0;
} 

1 个答案:

答案 0 :(得分:1)

这是使用较新的OpenCV 2.x界面的示例。此外,在您的代码中,您同时使用IplImageMat。通常,除非必须使用C。

,否则请使用OpenCV的C ++接口
VideoCapture cap;
Mat current_frame;
Mat previous_frame;
Mat result;    

cap.open(0);
if (!cap.isOpened()) {
    cerr << "can not open camera or video file" << endl;
    return -1;
}

while(1)
{
    cap >> current_frame;
    if (current_frame.empty())
        break;

    if (! previous_frame.empty())  {
        // subtract frames
        subtract(current_frame, previous_frame, result);
    }


    imshow("Window", result);
    waitKey(10);

    frame.copyTo(previous_frame); 
}