Harris 角点检测原理
Harris 角点检测是一种直接基于灰度图像的角点提取算法。
人眼对角点的识别通常是在一个局部区域(小窗口)内完成的。主要有三种情况:
- 小窗口在各个方向上移动,窗口内区域的灰度均发生较大的变化,那么就认为在窗口内遇到了角点。
- 小窗口在各个方向上移动,窗口内区域的灰度没有发生变化,那么就认为窗口内就不存在角点。
- 小窗口在各个方向上移动,仅在某一个方向移动时,窗口内区域的灰度才会发生较大的变化,那么就认为窗口内的图像可能是一条直线。如下图:

实现 Harris 角点检测:
- 计算图像 I(x,y) 在 x 和 y 两个方向的梯度 Ix , Iy。

- 计算图像两个方向梯度的乘积。

- 计算中心点为 (x,y) 的窗口 W 对应的矩阵 M。

A=∑(x,y)€Wg(I2x)=∑(x,y)€WI2x∗w(x,y)A=∑(x,y)€Wg(Ix2)=∑(x,y)€WIx2∗w(x,y)
B=∑(x,y)€Wg(I2y)=∑(x,y)€WI2y∗w(x,y)B=∑(x,y)€Wg(Iy2)=∑(x,y)€WIy2∗w(x,y)
C=∑(x,y)€Wg(IxIy)=∑(x,y)€WIxIy∗w(x,y)C=∑(x,y)€Wg(IxIy)=∑(x,y)€WIxIy∗w(x,y)
其中M=[ACCB]=∑(x,y)€Ww(x,y)[I2xIxIyIxIyI2y]M=[ACCB]=∑(x,y)€Ww(x,y)[Ix2IxIyIxIyIy2].
4、计算每个像素点(x,y)处的(x,y)处的Harris响应值RR;
R=det(M)−k(trace(M))2R=det(M)−k(trace(M))2
5、过滤大于某一阈值tt的RR值;
R={R:det(M)−k(trace(M))2>t}R={R:det(M)−k(trace(M))2>t}
如果需要在3×3或者5×5的邻域进行非最大值抑制,则局部最大值点即为图像中的角点。
计算公式为:

其中 M 是一个 n 阶方阵
- M 的对角线元素之和称为 M 的迹,记为 tr(M) , 即 tr(A) = m11 + m22 + ... + mnn;
- 所有取自不同行不同列的 n 个元素的乘积之和称为 M 的行列式,记为 det(M) 。
void cornerHarris(InputArray src, OutputArray dst, int blockSize, int ksize, double k, int borderType = BORDER_DEFAULT);
opencv —— Harris 角点检测
原文:https://www.cnblogs.com/bjxqmy/p/12456331.html