2

参考,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。

粗线有什么作用?>> 点数[1][k++] = 点数[1][i];

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

Q2。

随着框架循环绘制 cvCircle id,旧点在哪里清除并在哪里绘制新点?

我期待您的意见。

谢谢 =)

4

5 回答 5

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 的行中, i 总是递增(它由循环递增)但 k 仅在 status[i] 为真时递增。简而言之,它通过复制它们来消除数组中 status[i] 为假的任何点,然后将数组的长度(计数)设置为 k,即通过消除的数字。

于 2008-12-04T04:10:16.410 回答
1

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

于 2008-12-04T04:11:23.430 回答
0

我设法弄清楚点的清除完成的位置。随着帧循环,新点反映在新帧上,新帧刷新前一个帧。

于 2008-12-04T05:51:52.587 回答
0

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

于 2013-11-19T17:51:45.077 回答
0

方式过时了,但为了协议 -

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

它也使用 lkdemo 代码,并在其周围添加了一些附加功能。

您将在上面的链接中找到指向 AppStore 上的应用程序和项目源代码的链接。

HTH 任何人,干杯,

奥德

于 2011-04-09T20:43:05.700 回答