参考,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被绘制为框架循环时,旧点清除在哪里并绘制新点?
我期待您的投入。
谢谢=)
答案 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跟踪一个对象,我们每次迭代都会指出。这是一个好方法吗?为什么要这样做?