Harris 角点检测器
在本教程中,你将学到:
- 什么是特征,以及为什么特征很重要
- 使用函数 cv::cornerHarris 以 Harris-Stephens 方法检测角点。
什么是特征?
Section titled “什么是特征?”- 在计算机视觉中,我们通常需要在一个环境的不同帧之间寻找匹配点。为什么?如果我们知道两幅图像之间的关系,就可以利用这两幅图像来提取它们的信息。
- 我们所说的匹配点,一般指的是场景中那些我们容易识别的特征。我们把这些特征称为特征(features)。
- 那么,一个特征应该具备怎样的特性呢?
- 它必须是独一无二、可识别的
图像特征的类型
Section titled “图像特征的类型”列举几个:
- 边缘
- 角点(也称为兴趣点)
- 斑点(blobs,也称为感兴趣区域)
在本教程中,我们将专门研究角点特征。
为什么角点如此特殊?
Section titled “为什么角点如此特殊?”- 因为角点是两条边缘的交点,它代表了一个两条边缘方向发生变化的点。因此,图像的梯度(在两个方向上)都有较大的变化,这可以用来检测角点。
它是如何工作的?
Section titled “它是如何工作的?”-
让我们来寻找角点。由于角点代表了图像梯度的变化,我们将寻找这种”变化”。
-
考虑一幅灰度图像 。我们用一个窗口 (在 x 方向位移 、在 y 方向位移 )在 上滑动,并计算强度的变化。
其中:
- 是位于 处的窗口
- 是 处的强度
- 是位移后窗口 处的强度
-
由于我们寻找的是含有角点的窗口,也就是强度变化较大的窗口。因此,我们需要最大化上式,具体来说是这一项:
-
使用泰勒展开:
-
展开该式并做适当的抵消:
-
它可以表示为矩阵形式:
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}$$

-
对每个窗口计算一个分数,以判定它是否可能包含角点:
其中:
-
det(M) =
-
trace(M) =
分数 大于某个值的窗口就被认为是”角点”
-
本教程的代码如下所示。你也可以从 这里 下载。 代码见下方示例 本教程的代码如下所示。你也可以从 这里 下载。 代码见下方示例 本教程的代码如下所示。你也可以从 这里 下载。 代码见下方示例
原始图像:
检测到的角点用一个小黑圆圈标出