引用,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。

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

为什么选择k ++?我感到困惑,以为下一点被覆盖
当前点

Q2。

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

我期待着您的投入。

谢谢=)

最佳答案

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]为true时递增。简而言之,它通过复制状态[i]为假的值来消除数组中的任何点,然后将数组的长度(计数)设置为k(通过消除的数字)。

关于c++ - OpenCV示例程序lkdemo,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/339508/

10-11 15:51