qizongshuai 2015-03-07
如果我们进行图像处理的目的不是用于识别特征点而是进行稽核测量,则通常需要更高的精度,而cvGoodFeatureToTrack()只能提供简单的像素坐标值,但有时候我们会需要实际坐标值而不是证书坐标值,例如,我们想要确定图形中一个尖锐的峰值点的位置,但是峰值点的位置一般都不会位于一个像素点的正中心,,这时候就可以使用亚像素检测方法。
亚像素级角点的位置在摄像机标定、跟踪并重建摄像机的轨迹或者重建被跟踪目标的三维结构时就是一个基本的测量值。通过cvGoodFeaturesToTrack()函数可以求得角点坐标值,接下来就要讨论如何将求得的坐标值精确到亚像素级精度。方法就是向量的点积理论:一个向量和其正交的向量的点积为0,角点我们之前有说过了,就是两个边缘的相交,可以满足这样的情况。如下图:
当要求的点P位于一个区域的内部时,点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 );
1
image
输入图像.
corners
输入角点的初始坐标,也存储精确的输出坐标
count
角点数目
win
搜索窗口的一半尺寸。如果 win=(5,5) 那么使用 5*2+1 × 5*2+1 = 11 × 11 大小的搜索窗口
zero_zone
死区的一半尺寸,死区为不对搜索区的中央位置做求和运算的区域。它是用来避免自相关矩阵出现的某些可能的奇异性。当值为 (-1,-1) 表示没有死区。
criteria
求角点的迭代过程的终止条件。即角点位置的确定,要么迭代数大于某个设定值,或者是精确度达到某个设定值。 criteria 可以是最大迭代数目,或者是设定的精确度,也可以是它们的组合。
函数 cvFindCornerSubPix 通过迭代来发现具有子象素精度的角点位置,或如图所示的放射鞍点(radial saddle points)。
当找到一个q的新位置时,算法会以这个新的角点作为初始点进行迭代知道满足用户定义的迭代终止条件。
--------------------------------------分割线 --------------------------------------
--------------------------------------分割线 --------------------------------------
OpenCV的详细介绍:请点这里
OpenCV的下载地址:请点这里