如何使用OpenCV找到帧之间的差异?

时间:2012-04-03 17:17:47

标签: opencv

当我在OpenCV上运行视频时,如何找到帧之间的差异?我需要做一个循环来检查帧之间的变化,并在另一个窗口中显示结果? 我可以在我附加的循环中执行此操作吗?或者还有另一种方法吗?

while( key != 'x' )  
{  
   frame = cvQueryFrame( capture );
   cvCvtColor(frame, gray, CV_RGB2GRAY);

   //gray_frame = cvQueryFrame( capture );

   //cvCvtColor(frame, gray_frame, CV_BGR2GRAY);

   if(key==27)
        break;

   cvShowImage( "video",frame );
   cvShowImage( "grayvideo",gray );

   key = cvWaitKey( 1000 / fps );  
}  
cvDestroyWindow( "video" );  
cvDestroyWindow( "grayvideo" ); 
cvReleaseCapture( &capture );  

return 0;

我在命令窗口中收到此错误:编译器没有对齐堆栈变量。 Libavcodec被错误编译 并且可能非常慢或崩溃。这不是libavcodec中的错误, 但在编译器中。您可以尝试使用gcc> = 4.2重新编译。 不要向FFmpeg开发人员报告崩溃情况。 OpenCV错误:断言失败(src1.size()== dst.size()&& src1.type()== dst。 type())在未知函数中,文件........ \ ocv \ opencv \ src \ cxcore \ cxarithm.cpp ,第1563行

maby有什么问题maby的深度大小? 我该怎么办呢?或maby错误的代码? 非常感谢你的帮助

3 个答案:

答案 0 :(得分:3)

你可以减去两个Mat对象/指针。

Mat prev_frame;
cap.read(prev_frame);

while (1)
{
    Mat frame;
    cap.read(frame);

    Mat dif = frame - prev_frame;
    imshow("difference", dif);

    // you can also use absdiff
    //absdiff(frame, prev_frame, dif);

    prev_frame = frame.clone();
}

答案 1 :(得分:1)

框架差异有简单的方法,但我建议您检查OpenCV中的运动模板示例。它位于OpenCVversion \ samples \ c \ motempl.exe。这是做出差异的一些先进方法,可能是你感兴趣的。

如果你想用帧减法来实现它,你应该创建另一个IplImage来存储最后一帧并从那一帧中减去当前帧。还要确保创建另一个窗口以查看结果。

您应该查看此post以获取有关减法的信息。

您的代码应该类似于以下伪代码:

allocate space for frame, oldFrame and destinationFrame, all the same size/type.

while(1){      
  copy current frame to oldFrame
  grab new frame in frame

  cvSub(frame,oldFrame,dest)

  cvShow(dest)

}

我希望有所帮助。

亲切的问候, 丹尼尔

答案 2 :(得分:0)

这是您建议的新代码:

 #include "stdafx.h"
 #include <stdio.h> // For printf
 #include <cv.h>  
 #include <cxcore.h>  
 #include <highgui.h>      

int main()  
{  


    int key = 0; 




     CvCapture* capture = cvCaptureFromAVI( "macroblock.mpg" ); 
     IplImage* frame = cvQueryFrame( capture );
     IplImage* currframe = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,1);
     IplImage* destframe = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,1);

        if ( !capture ) 

    {  
        fprintf( stderr, "Cannot open AVI!\n" );  
        return 1;  
        }

      int fps = ( int )cvGetCaptureProperty( capture, CV_CAP_PROP_FPS );

      cvNamedWindow( "dest", CV_WINDOW_AUTOSIZE );

      while( key != 'x' )
          {
              frame = cvQueryFrame( capture );
        currframe = cvCloneImage( frame );
         frame = cvQueryFrame( capture );



              cvSub(frame,currframe,destframe);

              if(key==27 )break;
              cvShowImage( "dest",destframe);
               key = cvWaitKey( 1000 / fps );
               }  
           cvDestroyWindow( "dest" );
           cvReleaseCapture( &capture );
           return 0;
}