在OpenCv中提供了两种实现目标跟踪的关键算法,LK算法和HS算法,也就是通常所说的稀疏光流和稠密光流。
角点,其实也就是1幅图象中,容易被跟踪的特点点,通常来讲,这个点在两个正交方向上都有明显的倒数,该点在图象中我们认为是唯一无2的。
从直观上讲,角点是1类有足够信息并且能够从当前帧和下1帧都能提取出来的点。
关于角点的定义,是由Harris提出的,其基础是图象灰度强度的2阶导数矩阵 。该定义的角点位于图象2阶导数的自相干矩阵中有两个最大特点值的地方,这本质上表示以此点为中心周围存在最少两个不同方向的边沿。实际上1个角点也就是由两个不同方向的边沿相交而成的。而且,采取2阶导数是由于它对图象的均匀梯度不产生相应(梯度是1阶导数而来,如果1阶导数为均匀的,则2阶导数为0)。
void cvGoodFeaturesToTrack( const CvArr* image, CvArr* eig_image, CvArr* temp_image,
CvPoint2D32f* corners, int* corner_count,
double quality_level, double min_distance,
const CvArr* mask=NULL );
在这个函数中,输入图象image必须是8位或是32位,也就是IPL_DEPTH_8U 或是 IPL_DEPTH_32F 单通道图象。
第2和第3个参数是大小与输入图象相同的32位单通道图象。
参数 temp_image 和 eig_image 在计算进程中被当作临时变量使用,计算结束后eig_image中的内容是有效的。特别的,每一个函数包括了输入图象中对应的最小特点值。
corners 是函数的输出,为检测到 32位(CvPoint2D32f)的角点数组,在调用 cvGoodFeaturesToTrack 函数之前要为该数组分配内存空间。
corner_count 表示可以返回的最大角点数目,函数调用结束后,其返回实际检测到的角点数目。
quality_level 表示1点呗认为是角点的可接受的最小特点值,实际用于过滤角点的最小特点值是quality_level与图象汇总最大特点值的乘积,所以quality_level的值不应当超过1,通常取值为(0.10或是0.01)
检测完以后还要进1步剔除掉1些距离较近的角点,min_distance 保证返回的角点之间的距离不小于min_distance个像素
mask是可选参数,是1幅像素值为boolean类型的图象,用于指定输入图象中参与角点计算的像素点,若mask的值为NULL,值表示选择全部图象
block_size 是计算导数的自相干矩阵是指定的领域,采取小窗口计算的结果比单点(也就是block_size 为1)计算的结果要好
函数cvGoodFeaturesToTrack() 的输出结果为需找到的角点的位置数组。