Harris 角点是指在图像中具有较高灰度变化率的像素点,可以看作是图像中的“拐角”点。
Harris 角点检测算法主要包括以下步骤:
- 计算图像灰度值的梯度:对输入的灰度图像使用 Sobel 等算子计算每个像素的横向和纵向的灰度值梯度;
- 计算局部区域的自相关矩阵:对于每个像素点,计算其周围若干个像素构成的窗口内的灰度值梯度的协方差矩阵,以此来描述该点周围的梯度特性;
- 计算角点响应函数 R:通过计算自相关矩阵的特征值,来描述该点是否为角点。一般来说,当一个点的特征值较小时,可以认为它是平坦区域内的一个点;当特征值较大时,可以认为它是角点;当特征值差别较大时,可以认为它是边缘点;
- 对角点响应函数做非极大值抑制:遍历整张图像,抑制掉那些不是极大值的像素点,以得到更为准确和鲁棒的角点检测结果;
- 对角点结果进行阈值处理:对于角点响应函数 R 的值不超过一个预设的阈值的关键点,则被视为无效点,需要被排除。
harris角点API:
void cv::cornerHarris ( InputArray src,
OutputArray dst,
int blockSize,
int ksize,
double k,
int borderType = BORDER_DEFAULT
)
参数解析:
//InputArray src:输入图像,可以是单通道浮点型(CV_32F)或者灰度图像。
//OutputArray dst:输出结果,与输入图像相同大小和类型。该参数是一个计算出的响应图像(角点强度图)。
//int blockSize:角点检测时所考虑的邻域大小。它表示在每个像素周围的邻域内进行角点计算的窗口大小。通常设置为奇数,默认为3。
//int ksize:Sobel算子的孔径大小,用于计算图像梯度。只能是1、3、5或者7,默认为3。
//double k:角点响应函数中的自由参数,取值范围为[0.04, 0.06]。
//int borderType:边界模式,默认为BORDER_DEFAULT。可以选择不同的边界扩展方式,如BORDER_CONSTANT、BORDER_REPLICATE等。