《opencv学习笔记》-- 亚像素角点检测

亚像素级角点检测的位置在摄像机标定、跟踪并重建摄像机的轨迹,或者重建被跟踪目标的三维结构时,是一个基本的测测量值。
将所求得的角点位置精确到亚像素级精度 。一个向量和与其正交的向量的点积为0,角点则满足一下情况: 《opencv学习笔记》-- 亚像素角点检测_第1张图片

     其中,(a)点p附近的图像是均匀的,其梯度为0;(b)边缘的梯度与沿边缘方向的q-p向量正交。在图中的两种情况下,p点梯度与q-p向量的点积均为0。
      假设起始角点q在实际亚像素级角点的附近。检测所有的q-p向量。若点p位于一个均匀的区域,则点p处的梯度为0。若q-p向量的方向与边缘的方向一致,则此边缘上p点处的梯度与q-p向量正交,在这两种情况下,p点处的梯度与q-p向量的点积为0。我们可以在p点周围找到很多组梯度以及相关的向量q-p,令其点集为0,然后可以通过求解方程组,方程组的解即为角点q的亚像素级精度的位置,也就是精确的角点位置。

cornerSubPix()函数:寻找亚像素角点 (不是整数类型的位置,而是更精确的点类型位置)  

void cornerSubPix(InputArray image, InputoutputArray corners,
                  Size winSize, Size zeroZone, TermCriteria criteria)

参数1,InputArray类型的image,输入图像。

参数2,InputOutputArray类型的corners,提供输入角点的初始坐标和精确的输出坐标。

            (vector 类型

参数3,Size类型的winSize,搜索窗口的一半尺寸。若winSize = Size(5, 5),

             表示使用(5 * 2 + 1) × (5 * 2 + 1) = 11 × 11大小的搜索窗口。

参数4,Size类型的zeroZone,表示死区的一半尺寸。而死区为不对搜索区的中央位置做

            求和运算的区域,用来避免自相关矩阵出现的某些可能的奇异性。

            值为(-1, -1)表示没有死区

参数5,TermCriteria类型的criteria,求角点的迭代过程的终止条件。即角点位置的确定,

             要么迭代数大于某个设定值,或者是精确度达到某个设定值。criteria可以是最大迭代

             数目,或者是设定的精确度,也可以是它们的组合。

TermCriteri迭代标注类的构造函数

TermCriteria(int type, int maxCount, double epsilon);

参数1,int类型的type,枚举为TermCriteria::Type类型,终止标准的类型

枚举 描述
COUNT 1 要计算的最大迭代次数或则元素数
MAX_ITER 1 要计算的最大迭代次数或则元素数
EPS 2 迭代算法停止时所需的精度或者参数变化

参数2,int类型的maxCount,最大迭代次数/元素数;

参数3double类型的epsilon,所需的精度。

TermCriteria criteria = TermCriteria(TermCriteria::EPS + TermCriteria::MAX_ITER, 
                                     40, 0.001);

你可能感兴趣的:(opencv,opencv)