根据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
)。 最佳答案
如果您喜欢:
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
--------------
[编辑]
恕我直言,您也不希望每个循环有2 >>或读取操作,所以也许可以这样做:
Mat cur,prev;
while(1)
{
capture >> cur;
if ( ! prev.empty() )
{
process(cur,prev);
}
prev = cur.clone();
}