如果我们进行图像处理的目的不是提取用于识别的特征点而是进行几何测量,则通常需要更高的精度,而cvGoodFeaturesToTrack()只能提供简单的像素的坐标值,也就是说我们有时候需要实数坐标值而不是整数坐标值,所以要进行亚像素级角点的检测。亚像素检测方法就是一些有关峰值点位置的计算技巧,常见领域:三维重建、摄像机标定、图像拼接以及在卫星图像中查找特定信号,如一栋建筑的精确位置。亚像素级角点的位置在摄像机标定、跟踪并重建摄像机的轨迹或者重建被跟踪目标的三维结构时,是一个基本的测量值。理论参考文章:
1. D.Chen and G.Zhang,"A new sub-pixel detector for x-corners in camera calibration targets," WSCG Short Papers(2005):97-100.
2. L.Lucchese and S.K.Mitra,"Using saddle points for subpixel feature detection in camera calibration targets,"Proceedings of the 2002 Asia Pacific Conference on Circuits and Systems(pp.191-195),December 2000.
OpenCV函数:
void cvFindCornerSubPix(
const CvArr* image,
CvPoint2D32f* corners,
int count,
CvSize win,
CvSize zero_zone,
CvTermCriteria criteria
);
iamge 是8位单通道的灰度图像,是出入图像;
corners 整数值的像素位置,例如由cvGoodFeatures()得到的位置坐标,corners设定了角点的初始位置。
count 为需要计算的角点数目
win 指定了等式产生的窗口的尺寸,搜索窗口的中心是整个坐标值的角点并从中心点在每个方向上扩展win指定的像素
zero_zone定义了一个禁区,这个区域在方程组以及自相关矩阵中不被考虑,如果不需要这样一个禁区,则zero_zone应该设置为cvSize(-1,-1);
当找到一个q新位置时,算法会以这个新的角点作为初始点进行迭代知道满足用户定义的迭代终止条件。迭代过程的终止条件可以是最大迭代次数CV_TERMCRIT_ITER类型,或者是设定的精度CV_TERMCRIT_ITER类型,或者是两者的组合。