2013-05-06 101 views
0

我想从相同视频的previous帧中减去current帧的视频,并对所有视频和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

下面是使用新的OpenCV 2.x的界面例子。此外,在您的代码中,您同时使用IplImageMat。在一般情况下,使用的OpenCV的C++接口,除非你有使用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); 
} 
+0

如果你对此有何评论做视频处理,在这里我开始写的视频作为新的视频? – Rocket 2013-05-06 15:37:17

+0

我只是想告诉你如何保存当前帧和前一帧,以便它可以在你的循环中使用,因为那是你的问题。是的,你可以写入文件框架或做你需要的任何处理。此外,在第一次迭代中'previous_frame'没有被初始化,所以你需要确保你不使用它(只在第一次迭代中)。 – Alexey 2013-05-06 15:46:30

+0

我很难理解你的代码 – Rocket 2013-05-12 15:34:21