如果我们进行图象处理的目的不是用于辨认特点点而是进行稽核丈量,则通常需要更高的精度,而cvGoodFeatureToTrack()只能提供简单的像素坐标值,但有时候我们会需要实际坐标值而不是证书坐标值,例如,我们想要肯定图形中1个尖锐的峰值点的位置,但是峰值点的位置1般都不会位于1个像素点的正中心,,这时候候就能够使用亚像素检测方法。
亚像素级角点的位置在摄像机标定、跟踪并重建摄像机的轨迹或重建被跟踪目标的3维结构时就是1个基本的丈量值。通过cvGoodFeaturesToTrack()函数可以求得角点坐标值,接下来就要讨论如何将求得的坐标值精确到亚像素级精度。方法就是向量的点积理论:1个向量和其正交的向量的点积为0,角点我们之前有说过了,就是两个边沿的相交,可以满足这样的情况。以下图:
当要求的点P位于1个区域的内部时,点p边沿是平缓的,它的梯度值为0,此时向量 的与p的梯度点积为0,;
当点p位于区域的边沿的时候,向量 与区域平行,而p的梯度值则与边沿垂直,此时向量 的与p的梯度点积为0。
这两种情况下,向量 与P点的梯度都是正交的。先假定起始角点q在实际亚像素级角点p附近,则我们可以在要求的p点的周围取到很多p点的梯度和相干向量 令其点积为0,然后就能够通过求解方程组,方程组的解就是角点q的亚像素精度的位置,也就是精确角点的位置。
代码以下:
void cvFindCornerSubPix( const CvArr* image, CvPoint2D32f* corners,
int count, CvSize win,
CvSize zero_zone,
CvTermCriteria criteria );
image
输入图象.
corners
输入角点的初始坐标,也存储精确的输出坐标
count
角点数目
win
搜索窗口的1半尺寸。如果 win=(5,5) 那末使用 5*2+1 × 5*2+1 = 11 × 11 大小的搜索窗口
zero_zone
死区的1半尺寸,死区为不对搜索区的中央位置做求和运算的区域。它是用来避免自相干矩阵出现的某些可能的奇特性。当值为 (⑴,⑴) 表示没有死区。
criteria
求角点的迭代进程的终止条件。即角点位置的肯定,要末迭代数大于某个设定值,或是精确度到达某个设定值。 criteria 可以是最大迭代数目,或是设定的精确度,也能够是它们的组合。
函数 cvFindCornerSubPix 通过迭代来发现具有子象素精度的角点位置,或如图所示的放射鞍点(radial saddle points)。
当找到1个q的新位置时,算法会以这个新的角点作为初始点进行迭代知道满足用户定义的迭代终止条件。
下一篇 mysql开机自启动设置