2008-12-04 62 views
2

参考,OpenCV的\样本\ C \ lkdemo.cOpenCV的示例程序lkdemo

任何人都知道是什么代码下面的代码片段呢?

代码从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萃取。

粗线表示什么? >>points [1] [k ++] = points [1] [i];

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

Q2。

由于cvCircle id是作为帧循环绘制的,旧点清除和新点绘制在哪里?

我期待您的意见。

感谢=)

回答

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才会增加。简而言之,它通过复制它们而消除了状态[i]为false的数组中的任何点,然后将数组的长度(count)设置为k,即通过消除的数字。

+0

谢谢保罗我现在得到它=) – user43076 2008-12-04 05:44:28

1

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

0

我设法找出结束点的位置。 由于帧循环,新点将反映在新帧上,新帧将刷新前一帧。

0

方式过时,但对协议的缘故 -

有一个开源卢卡斯金出武雄应用对于现在的iPhone - http://www.success-ware.com/150842/Lucas-Kanade-Detection-for-the-iPhone

它使用lkdemo代码为好,并增加了周围的一些附加功能。

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

HTH人, 干杯,

俄德

0

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