OpenCV(C ++)矩阵版本没有按预期工作?

时间:2014-03-20 19:24:12

标签: c++ opencv

根据OpenCV Intro Doc,我在下面写的代码应该导致im为第2帧,imPrev第1帧;然而,它们都是第2帧。为什么以及什么是简单有效的解决方案?

Mat im, imPrev;
VideoCapture v(fileName);

v >> im;           // im = frame1
imPrev = im;       // im = imPrev = frame1
im.release();      // im = empty, imPrev = frame1
v >> im;           // I wanted      im = frame2, imPrev = frame1
                   // but it became im = imPrev = frame2

(OpenCV 2.4.5)

注意:最后三行是循环的,所以我最好避免在每次迭代时避免不必要的内存分配(例如使用clone)。

1 个答案:

答案 0 :(得分:0)

如果您愿意:

v>> IM;

你得到一个img,它指向网络摄像头驱动程序内的静态内存。

它没有被重新计算,所以你的im.release()根本没有效果。

-------------

但问题在于:

imPrev = im;   
// this is a shallow copy only, the Mat struct gets copied, the pixels are shared.

将其替换为:

imPrev = im.clone(); // imPrev now owns it own pixels

--------------

[编辑]

imho,你也不想要2>>或者每个循环读取操作,所以也许吧:

Mat cur,prev;
while(1)
{
   capture >> cur;
   if ( ! prev.empty() )
   {
        process(cur,prev);
   }
   prev = cur.clone();
}