OpenCV 4.11.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\) 大于某个值的窗口被认为是“角点”

代码

解释

结果

原始图像

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