OpenCV  4.10.0
开源计算机视觉
加载中...
搜索中...
无匹配项
Harris 角点检测器

下一个教程: Shi-Tomasi 角点检测器

原作者安娜·乌阿曼
兼容性OpenCV >= 3.0

目标

在本教程中,您将学习

  • 什么是特征,以及它们为何重要
  • 使用函数 cv::cornerHarris 来利用 Harris-Stephens 方法检测角点。

理论

什么是特征?

  • 在计算机视觉中,通常我们需要在环境的不同帧之间找到匹配点。为什么?如果我们了解两幅图像之间的关联方式,我们就能将这两幅图像结合起来对它们提取信息。
  • 当我们说匹配点时,我们指的是场景中我们可以轻松识别的特性(广义而言)。我们称这些特性为特征
  • 那么,一个特征应具备哪些特性?
    • 它必须独一无二,易于辨识

图像特征类型

举例来说

  • 边缘
  • 角点(又称为兴趣点)
  • 斑点(又称为感兴趣区域)

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

为什么角点如此特别?

  • 因为角点是两条边的交点,它表示这两条边的方向改变的点。因此,图像的梯度(在两个方向上)具有较大的变化,这可以用来检测它。

它如何工作?

  • 让我们寻找角点。由于角点代表图像中梯度的变化,我们将寻找这种“变化”。
  • 设灰度图像为 \(I\)。我们将在 \(I\) 中扫描一个窗口 \(w(x,y)\)(在 x 方向的位移为 \(u\),在 y 方向的位移为 \(v\),并计算强度的变化。

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

    其中

    • \(w(x,y)\) 是位于位置 \((x,y)\) 的窗口
    • \(I(x,y)\) 是 \((x,y)\) 的强度
    • \(I(x+u,y+v)\) 是移动窗口 \((x+u,y+v)\) 的强度
  • 由于我们正在寻找具有角点的窗口,因此我们正在寻找具有强度较大变化的窗口。因此,我们必须使上式最大化,特别是以下一项

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

  • 利用泰勒展开

    \[E(u,v) \approx \sum _{x,y}[ I(x,y) + u I_{x} + vI_{y} - I(x,y)]^{2}\]

  • 展开该方程并适当抵消

    \[E(u,v) \approx \sum _{x,y} u^{2}I_{x}^{2} + 2uvI_{x}I_{y} + v^{2}I_{y}^{2}\]

  • 可用矩阵形式表示如下

\[E(u,v) \approx \begin{bmatrix} 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}\]

  • 记为

\[M = \displaystyle \sum_{x,y} w(x,y) \begin{bmatrix} I_x^{2} & I_{x}I_{y} \\ I_xI_{y} & I_{y}^{2} \end{bmatrix}\]

  • 因此,我们的方程现在是

\[E(u,v) \approx \begin{bmatrix} u & v \end{bmatrix} M \begin{bmatrix} u \\ v \end{bmatrix}\]

  • 为每个窗口计算一个分数,以确定窗口是否可能包含一个角

    \[R = det(M) - k(trace(M))^{2}\]

    其中

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

    分数 \(R\) 大于某个值的窗口会被视为“角”

代码

说明

结果

原图

检测到的角点周围有一个小黑圈