角点检测(Corner Detection)是计算机视觉系统中用来获取图像特征的一种方法,广泛应用于运动检测、图像匹配、视频跟踪、三维建模和目标识别等领域中,也称为特征点检测。角点检测被定义为两条边的交点,更严格的说法是,角点的局部领域应该具有两个不同区域的不同方向的边界。而实际应用中,大多数所谓的角点检测方法检测的是拥有特定特征的图像点,而不仅仅是“角点”。这些特征点在图像中有具体的坐标,并具有某些数学特征,如局部最大或最小灰度、某些梯度特征等。
Harris角点检测
计算过程
角点检测中使E(u,v)E(u,v)的值最大。利用一阶泰勒展开有:
可用sobel算子计算,推导过程如下:
M矩阵决定了E(u,v)的取值,下面我们利用M来求角点,M是关于x和 y方向导数的二次项函数,可以表示成椭圆的形状,椭圆的长短半轴由MM的特征值λ1和λ2决定,方向由特征矢量决定,如下图所示:
椭圆函数特征值与图像中的角点、直线(边缘)和平面之间的关系如下:
- 图像中的直线:一个特征值大,另一个特征值小
- 图像中的平面:两个特征值都小,且近似相等
- 图像中的角点:两个特征值都大,且近似相等
Harris给出的角点计算方法并不需要计算具体的特征值,而是计算一个角点响应值R来判断角点。R的计算公式为
- detM:矩阵M的行列式,即λ*1\λ2
- traceM:为矩阵M的迹,即λ1+λ2
- α:常数,取值范围为0.04~0.06
R与图像中的角点、直线(边缘)和平面之间的关系如下:
- 当R为大数值的正数时是角点
- 当R为大数值的负数时是边界
- 当R为小数是认为是平坦区域
API介绍
void cornerHarris( InputArray src, OutputArray dst, int blockSize,int ksize, double k,int borderType = BORDER_DEFAULT );
/*******************************************************************
* src: 输入图
* dst: 输出图
* blockSize: 邻域的大小
* ksize: Sobel()算子孔径大小
* k: Harris参数
* borderType: 边界处理模式
*********************************************************************/
//图像增强 saturate_cast(|α*src+β|)
void convertScaleAbs(InputArray src, OutputArray dst,double alpha = 1, double beta = 0);
/*******************************************************************
* src: 输入图
* dst: 输出图
* alpha: α
* beta: β
*********************************************************************/
//归一化
void normalize( InputArray src, InputOutputArray dst, double alpha = 1, double beta = 0,int norm_type = NORM_L2, int dtype = -1, InputArray mask = noArray());
/*******************************************************************
* src: 输入图
* dst: 输出图
* alpha: 归一化最小值
* beta: 归一化最大值
* norm_type: 归一化的类型
* dtype: 图像通道数
* mask: 操作掩膜
*********************************************************************/
//norm_type取值
enum NormTypes {
NORM_INF = 1, //无穷范数 (元素中绝对值最大的数值)
NORM_L1 = 2, //L1范数 (所有元素的绝对值的和)
NORM_L2 = 4, //L2范数 (所有元素平方和的开平方)
NORM_L2SQR = 5, //L2范数平方 (所有元素平方和)
NORM_HAMMING = 6, //汉明范数 CV_8U图像
ORM_HAMMING2 = 7, //汉明范数2
NORM_TYPE_MASK = 7, //特定掩码范数
NORM_RELATIVE = 8, //相对范数
NORM_MINMAX = 32 //特定区域范数
};
写不动了,明天在更.