【问题标题】:How to find the differences between frames using OpenCV?如何使用 OpenCV 找到帧之间的差异?
【发布时间】:2014-01-15 23:56:13
【问题描述】:

当我在 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 深度的大小有什么问题? 我该如何解决?或者代码可能有问题? 非常感谢您的帮助

【问题讨论】:

  • 花时间查看您的其他问题并接受解决问题的答案!每个答案附近都有一个小复选框,您可以单击它来选择官方答案。这样你也可以帮助社区。​​span>
  • 您是指相似图像(物体场景)之间的差异程度,还是只想计算差异图像,如 Diff = frame[N] - frame[N+1]?你能澄清你的问题吗

标签: opencv


【解决方案1】:

您可以减去两个 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();
}

【讨论】:

    【解决方案2】:

    帧差异有一些简单的方法,但我建议您检查 OpenCV 中的 Motion Template 示例。它位于 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)
    

    }

    希望对你有帮助。

    亲切的问候, 丹尼尔

    【讨论】:

      【解决方案3】:

      这是您建议中的新代码:

       #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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-01
        • 2018-06-27
        • 2020-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多