角点检测之Harris角点检测的原理及opencv中API的应用

来源:互联网 发布:h3c交换机端口汇聚 编辑:程序博客网 时间:2024/06/04 08:13

本篇博客主要是对下面几篇博客的内容进行了小结:

1.Harris角点
2. 【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测
3.Opencv学习笔记(五)Harris角点检测
4.Harris角点检测原理分析

1. 不同类型的角点

在现实世界中,角点对应于物体的拐角,道路的十字路口、丁字路口等。关于角点的具体描述可以有几种:

1). 一阶导数(即灰度的梯度)的局部最大所对应的像素点;

2). 两条及两条以上边缘的交点;

3). 图像中梯度值和梯度方向的变化速率都很高的点;

4).角点处的一阶导数最大,二阶导数为零,指示物体边缘变化不连续的方向。

从求解思路上可以分为两种,一种基于边缘,一种基于图像灰度。前者往往需要对图像边缘进行编码,这在很大程度上依赖于图像的分割与边缘提取,具有相当大的难度和计算量,且一旦待检测目标局部发生变化,很可能导致操作的失败。早期主要有Rosenfeld和Freeman等人的方法,后期有CSS等方法。

基于图像灰度的方法通过计算点的曲率及梯度来检测角点,避免了第一类方法存在的缺陷,此类方法主要有Moravec算子、Forstner算子、Harris算子、SUSAN算子等。

image

这篇文章主要介绍Harris角点检测的算法原理。

2. Harris角点

2.1 基本原理

人眼对角点的识别通常是在一个局部的小区域或小窗口完成的。如果在各个方向上移动这个特征的小窗口,窗口内区域的灰度发生了较大的变化,那么就认为在窗口内遇到了角点。如果这个特定的窗口在图像各个方向上移动时,窗口内图像的灰度没有发生变化,那么窗口内就不存在角点;如果窗口在某一个方向移动时,窗口内图像的灰度发生了较大的变化,而在另一些方向上没有发生变化,那么,窗口内的图像可能就是一条直线的线段。

image

对于图像,当在点处平移后的自相似性,可以通过自相关函数给出:


其中,是以点为中心的窗口,为加权函数,它既可是常数,也可以是高斯加权函数。

image

根据泰勒展开,对图像在平移后进行一阶近似:

其中,是图像的偏导数,这样的话,自相关函数则可以简化为:


其中




也就是说图像

在点处平移后的自相关函数可以近似为二项函数:


其中



二次项函数本质上就是一个椭圆函数。椭圆的扁率和尺寸是由的特征值决定的,椭圆的方向是由的特征矢量决定的,如下图所示,椭圆方程为:



image

椭圆函数特征值与图像中的角点、直线(边缘)和平面之间的关系如下图所示。共可分为三种情况:

  • 图像中的直线。一个特征值大,另一个特征值小,。自相关函数值在某一方向上大,在其他方向上小。
  • 图像中的平面。两个特征值都小,且近似相等;自相关函数数值在各个方向上都小。
  • 图像中的角点。两个特征值都大,且近似相等,自相关函数在所有方向都增大。

    image

根据二次项函数特征值的计算公式,我们可以求矩阵的特征值。但是Harris给出的角点差别方法并不需要计算具体的特征值,而是计算一个角点响应值来判断角点。的计算公式为:



式中,为矩阵的行列式;为矩阵的直迹;为经常常数,取值范围为0.04~0.06。

增大α的值,将减小角点响应值R,降低角点检测的灵敏性,减少被检测角点的数量;减小α值,将增大角点响应值R,增加角点检测的灵敏性,增加被检测角点的数量。


事实上,特征值隐含在中,因为

1

R取决于M的特征值,对于角点|R|很大,平坦的区域|R|很小,边缘的R为负值。


2.2 Opencv API接口
可以参考
1).cornerHarris() 
2). cornerHarris demo
C: void cvCornerHarris(const CvArr* image, CvArr* harris_response, int block_size, int aperture_size=3, double k=0.04 )
Parameters:
  • src – Input single-channel 8-bit or floating-point image.
  • dst – Image to store the Harris detector responses. It has the type CV_32FC1 and the same size as src .
  • blockSize – Neighborhood size (see the details on cornerEigenValsAndVecs() ).
  • ksize – Aperture parameter for the Sobel() operator.
  • k – Harris detector free parameter. See the formula below.
  • borderType – Pixel extrapolation method. See borderInterpolate() .

The function runs the Harris corner detector on the image. Similarly to cornerMinEigenVal() andcornerEigenValsAndVecs() , for each pixel (x, y) it calculates a 2\times2 gradient covariance matrix M^{(x,y)} over a \texttt{blockSize} \times \texttt{blockSize} neighborhood. Then, it computes the following characteristic:

\texttt{dst} (x,y) =  \mathrm{det} M^{(x,y)} - k  \cdot \left ( \mathrm{tr} M^{(x,y)} \right )^2

Corners in the image can be found as the local maxima of this response map.

edu.51cto.com
参数说明
-
blockSize
计算
时候的矩阵大小
-
Ksize
窗口大小
-
K
表示计算角度响应时候的参数大小,
默认在
0.04~0.06
其中上面的参数中
-blockSize–就是窗口函数W(x, y)大小
-Ksize-sobel算子核的大小,可取1,3,5。。。(用sobel函数来得到Ix, Iy)
-K表示计算角度响应时候的参数大小,默认在0.04~0.06。


关于Harris算法的源代码可以参考Harris源代码分析。