Skip to content

Harris 角点检测器

在本教程中,你将学到:

  • 什么是特征,以及为什么特征很重要
  • 使用函数 cv::cornerHarris 以 Harris-Stephens 方法检测角点。
  • 在计算机视觉中,我们通常需要在一个环境的不同帧之间寻找匹配点。为什么?如果我们知道两幅图像之间的关系,就可以利用这两幅图像来提取它们的信息。
  • 我们所说的匹配点,一般指的是场景中那些我们容易识别的特征。我们把这些特征称为特征(features)。
  • 那么,一个特征应该具备怎样的特性呢?
    • 它必须是独一无二、可识别的

列举几个:

  • 边缘
  • 角点(也称为兴趣点)
  • 斑点(blobs,也称为感兴趣区域)

在本教程中,我们将专门研究角点特征。

  • 因为角点是两条边缘的交点,它代表了一个两条边缘方向发生变化的点。因此,图像的梯度(在两个方向上)都有较大的变化,这可以用来检测角点。
  • 让我们来寻找角点。由于角点代表了图像梯度的变化,我们将寻找这种”变化”。

  • 考虑一幅灰度图像 II。我们用一个窗口 w(x,y)w(x,y)(在 x 方向位移 uu、在 y 方向位移 vv)在 II 上滑动,并计算强度的变化。

    E(u,v)=∑x,yw[x,y](I(x+u,y+v)−I(x,y))2E(u,v) = \sum _{x,y} w[x,y]( I(x+u,y+v) - I(x,y))^{2}

    其中:

    • w(x,y)w(x,y) 是位于 (x,y)(x,y) 处的窗口
    • I(x,y)I(x,y) 是 (x,y)(x,y) 处的强度
    • I(x+u,y+v)I(x+u,y+v) 是位移后窗口 (x+u,y+v)(x+u,y+v) 处的强度
  • 由于我们寻找的是含有角点的窗口,也就是强度变化较大的窗口。因此,我们需要最大化上式,具体来说是这一项:

    ∑x,y[I(x+u,y+v)−I(x,y)]2\sum _{x,y}[ I(x+u,y+v) - I(x,y)]^{2}

  • 使用泰勒展开:

    E(u,v)≈∑∗x,y[I(x,y)+uI∗x+vIy−I(x,y)]2E(u,v) \approx \sum *{x,y}[ I(x,y) + u I*{x} + vI_{y} - I(x,y)]^{2}

  • 展开该式并做适当的抵消:

    E(u,v)≈∑∗x,yu2I∗x2+2uvIxIy+v2Iy2E(u,v) \approx \sum *{x,y} u^{2}I*{x}^{2} + 2uvI_{x}I_{y} + v^{2}I_{y}^{2}

  • 它可以表示为矩阵形式:

u & v
\end{bmatrix}
\left (
\displaystyle \sum_{x,y}
w(x,y)
\begin{bmatrix}
I_x^{2} & I_{x}I_{y} \\
I_xI_{y} & I_{y}^{2}
\end{bmatrix}
\right )
\begin{bmatrix}
u \\
v
\end{bmatrix}$$
  • 记:

w(x,y)
\begin{bmatrix}
I_x^{2} & I_{x}I_{y} \\
I_xI_{y} & I_{y}^{2}
\end{bmatrix}$$
  • 于是,我们的方程现在变为:

u & v
\end{bmatrix}
M
\begin{bmatrix}
u \\
v
\end{bmatrix}$$

Harris_Detector_Original_Image.jpg Harris_Detector_Result.jpg

  • 对每个窗口计算一个分数,以判定它是否可能包含角点:

    R=det(M)−k(trace(M))2R = det(M) - k(trace(M))^{2}

    其中:

    • det(M) = λ1λ2\lambda_{1}\lambda_{2}

    • trace(M) = λ1+λ2\lambda_{1}+\lambda_{2}

      分数 RR 大于某个值的窗口就被认为是”角点”

本教程的代码如下所示。你也可以从 这里 下载。 代码见下方示例 本教程的代码如下所示。你也可以从 这里 下载。 代码见下方示例 本教程的代码如下所示。你也可以从 这里 下载。 代码见下方示例

原始图像:

检测到的角点用一个小黑圆圈标出