OpenCV示例程序lkdemo

时间:2008-12-04 03:09:12

标签: c++ opencv opticalflow

参考,OpenCv \ samples \ c \ lkdemo.c

有人知道下面的代码片段有什么作用吗?

从lkdemo.c中提取的代码

 for( i = k = 0; i < count; i++ )
            {
                if( add_remove_pt )
                {
                    double dx = pt.x - points[1][i].x;
                    double dy = pt.y - points[1][i].y;

                    if( dx*dx + dy*dy <= 25 )
                    {
                        add_remove_pt = 0;
                        continue;
                    }
                }

                if( !status[i] )
                    continue;

                points[1][k++] = points[1][i];
                cvCircle( image, cvPointFrom32f(points[1][i]), 3, CV_RGB(0,255,0), -1, 8,0);
            }
            count = k;

Q1。

粗线有什么作用? &GT;&GT; points [1] [k ++] = points [1] [i];

为什么选择k ++?我很困惑,认为下一点被覆盖了 当前点

Q2。

当cvCircle id被绘制为框架循环时,旧点清除在哪里并绘制新点?

我期待您的投入。

谢谢=)

5 个答案:

答案 0 :(得分:3)

Q1:

如果我重构代码,也许会有所帮助:

if( status[i] ) {
    points[1][k++] = points[1][i];  // <---- Q1
    cvCircle( image, cvPointFrom32f(points[1][i]), 3, CV_RGB(0,255,0), -1, 8,0);
}

因此在问题1的行中,我总是递增(它由循环递增)但k仅在status [i]为真时递增。简而言之,它通过复制它们,然后将数组的长度(计数)设置为k(通过消除的数字)来消除数组中status [i]为假的任何点。

答案 1 :(得分:1)

它消除了漂移超过5个像素(5 * 5 = 25)的任何点。当删除点时,k用于跟踪输出索引。

答案 2 :(得分:0)

我设法找出清点的地方。 作为帧循环,新点将反映在新帧和新帧上 框架刷新前一个。

答案 3 :(得分:0)

方式过时了,但出于协议的考虑 -

现在有一个针对iPhone的开源Lucas Kanade应用程序 - http://www.success-ware.com/150842/Lucas-Kanade-Detection-for-the-iPhone

它也使用lkdemo代码,并在其周围添加一些额外内容。

您可以找到AppStore上的应用程序和上面链接中项目源代码的链接。

HTH任何人, 欢呼声,

乌迪德

答案 4 :(得分:0)

让我看看我是否明白了。此块代码消除了status [i]为false的任何点,即前一图像中未在当前图像中找到的点。但是这样做,我们在追踪中失去了这些点,不是吗?我的意思是,如果我们用N px跟踪一个对象,我们每次迭代都会指出。这是一个好方法吗?为什么要这样做?