Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual c++ 如何从视频中保存下一帧和当前帧_Visual C++_Opencv_Image Processing_Computer Vision - Fatal编程技术网

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

Visual c++ 如何从视频中保存下一帧和当前帧,visual-c++,opencv,image-processing,computer-vision,Visual C++,Opencv,Image Processing,Computer Vision,我想从同一视频的前一帧中减去当前视频帧,并对所有视频执行相同的操作,然后将这些帧写入seprate video,我在保存当前帧和下一帧时感到困惑。如何保存它们,以便在下一帧出现时,它成为下一帧的上一帧 IplImage* skipNFrames(CvCapture* capture, int n) { for(int i = 0; i < n; ++i) { if(cvQueryFrame(capture) == NULL) {

我想从同一视频的
前一帧
中减去
当前
视频帧,并对所有视频执行相同的操作,然后
将这些帧写入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;
} 
IplImage*skipNFrames(CvCapture*capture,int n)
{
对于(int i=0;i>当前_帧;
if(当前_frame.empty())
打破
//做视频处理
imshow(“窗口”,当前帧);
等候室(10);
frame=skipNFrames(捕获,1)
frame.copyTo(上一帧);
int frame_width=(int)cvGetCaptureProperty(捕获、CV_CAP_PROP_frame_width);
int frame_height=(int)cvGetCaptureProperty(捕获、CV_CAP_PROP_frame_height);
int fps=(int)cvGetCaptureProperty(捕获,CV_CAP_PROP_fps);
//创建视频编写器结构
CvVideoWriter*writer=0;
writer=cvCreateVideoWriter(“savedVideo.avi”,CV_FOURCC('M','P','4','2'),fps,cvSize(帧宽,帧高),1);
if(!writer){
//释放内存
cvReleaseCapture(&capture);
返回0;
}
while(true){
//按顺序抓取并检索视频的每一帧
IplImage*frame=cvQueryFrame(新的_图像);
如果(!帧)中断;
//逐帧写入输出文件
cvWriteFrame(writer,frame);
}
cvReleaseVideoWriter(&writer);
cvReleaseCapture(&capture);
返回0;
}
}
//返回新的图像
//返回cvQueryFrame(捕获);
} 
int main(int argc,char*argv[])
{
CvCapture*capture=cvCaptureFromFile(“try.avi”);
字符缓冲区[1000];
int标志=0;
IplImage*frame=NULL;
做
{
//frame=skipNFrames(捕获,1);
cvNamedWindow(“框架”,CV_窗口_自动调整大小);
cvShowImage(“帧”,帧);
cvWaitKey(0);
char*str=新字符[50];
flag++;
sprintf(str,“%d”,标志);
strcat(str,“frame”);
strcat(str,“.png”);
Mat图像=帧;
imwrite(str,image);
}while(frame!=NULL);
cvReleaseCapture(&capture);
窗口(“框架”);
cvReleaseImage(&frame);
返回0;
} 

这是一个使用更新的OpenCV 2。x接口的例子。在代码中,你同时使用了<代码> IplImage < /C>和<代码> Mat 。一般来说,除非你必须使用C.< /P>,否则使用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); 
}
videocap;
Mat-current_-frame;
垫上一层框架;
Mat结果;
上限开放(0);
如果(!cap.isOpened()){
当前帧;
if(当前_frame.empty())
打破
如果(!previous_frame.empty()){
//减去帧
减去(当前帧、上一帧、结果);
}
imshow(“窗口”,结果);
等候室(10);
frame.copyTo(上一帧);
}

在您评论视频处理的地方,我开始将视频作为新视频写入?我只是想告诉您如何保存当前帧和上一帧,以便在循环中可用,因为这是您的问题。是的,您可以将帧写入文件或执行任何您需要的处理。此外,在第一次迭代中
上一次\frame未初始化,因此您需要确保不使用它(仅在第一次迭代中)。我更新了我的代码,如果你访问它,请不要只是指出我的错误,所以我会管理它,因为我是opencv的新手。我的代码有什么不清楚的地方?Myabe你应该买一本关于opencv或编程的书。请具体说明你的问题。我不知道你想实现什么。你到底有什么困难?你认为呢你的意思是“从上一帧中删除视频的当前帧”。你是从当前帧中减去上一帧吗?你写什么来写入输出?