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

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

原始作者Ana Huamán
兼容性OpenCV >= 3.0

目标

在本教程中,您将学习

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

理论

什么是特征?

  • 在计算机视觉中,通常我们需要找到环境中不同帧之间的匹配点。为什么?如果我们知道两幅图像如何相互关联,我们就可以使用*这两幅*图像来提取它们的信息。
  • 当我们说 匹配点 时,通常是指场景中我们容易识别的 特性。我们称这些特性为 特征
  • 那么,特征应该具备哪些特性呢?
    • 它必须是 *唯一可识别的*

图像特征的类型

列举如下

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

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

为什么角点如此特殊?

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

它是如何工作的?

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

    \[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\) 大于某个特定值的窗口被视为“角点”

代码

解释

结果

原始图像

检测到的角点被小黑圈包围