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