`

【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测

 
阅读更多

角点

特征检测与匹配是Computer Vision 应用总重要的一部分,这需要寻找图像之间的特征建立对应关系。点,也就是图像中的特殊位置,是很常用的一类特征,点的局部特征也可以叫做“关键特征点”(keypoint feature ),或“兴趣点”(interest point ),或“角点”(conrner )。

关于角点的具体描述可以有几种:

  • 一阶导数(即灰度的梯度)的局部最大所对应的像素点;
  • 两条及两条以上边缘的交点;
  • 图像中梯度值和梯度方向的变化速率都很高的点;
  • 角点处的一阶导数最大,二阶导数为零,指示物体边缘变化不连续的方向。

 

Harris角点检测

当一个窗口在图像上移动,在平滑区域如图(a),窗口在各个方向上没有变化。在边缘上如图(b),窗口在边缘的方向上没有变化。在角点处如图(c),窗口在各个方向上具有变化。Harris角点检测正是利用了这个直观的物理现象,通过窗口在各个方向上的变化程度,决定是否为角点。

将图像窗口平移[u,v]产生灰度变化E(u,v)

由: , 得到:

对于局部微小的移动量 [u,v],近似表达为:

其中M是 2*2 矩阵,可由图像的导数求得:

E(u,v)的椭圆形式如下图:

 

定义角点响应函数 R 为:

Harris角点检测算法就是对角点响应函数R进行阈值处理:R > threshold,即提取R的局部极大值。

【相关代码】

OpenCV中定义了 cornerHarris 函数:

void cornerHarris( InputArray src, OutputArray dst, int blockSize,
                                int ksize, double k,
                                int borderType=BORDER_DEFAULT );

可以结合 convertScaleAbs 函数,通过阈值取角点:

void cornerHarris_demo( int, void* )
{
  Mat dst, dst_norm;
  dst = Mat::zeros( src.size(), CV_32FC1 );
  /// Detector parameters
  int blockSize = 2;
  int apertureSize = 3;
  double k = 0.04;
  /// Detecting corners
  cornerHarris( src_gray, dst, blockSize, apertureSize, k, BORDER_DEFAULT );
  /// Normalizing
  normalize( dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat() );
  convertScaleAbs( dst_norm, dst_norm_scaled ); 
  /// Drawing a circle around corners
  for( int j = 0; j < dst_norm.rows ; j++ )
     { for( int i = 0; i < dst_norm.cols; i++ )
          {
            if( (int) dst_norm.at<float>(j,i) > thresh )
              { 
				circle( dst_norm_scaled, Point( i, j ), 5,  Scalar(0), 2, 8, 0 ); 
				circle(src,Point( i, j ), 5,  Scalar(255,0,0), -1, 8, 0 );
              }
          } 
     }    
  /// Showing the result
  imshow( corners_window, dst_norm_scaled );
  imshow( source_window, src );  
}

 

Shi-Tomasi 算法

Shi-Tomasi 算法是Harris 算法的改进。Harris 算法最原始的定义是将矩阵 M 的行列式值与 M 的迹相减,再将差值同预先给定的阈值进行比较。后来Shi 和Tomasi 提出改进的方法,若两个特征值中较小的一个大于最小阈值,则会得到强角点。

如上面第二幅图中,对自相关矩阵 M 进行特征值分析,产生两个特征值 和两个特征方向向量。因为较大的不确定度取决于较小的特征值,也就是 ,所以通过寻找最小特征值的最大值来寻找好的特征点也就解释的通了。
Shi 和Tomasi 的方法比较充分,并且在很多情况下可以得到比使用Harris 算法更好的结果。

 

【相关代码】

由于这种Shi-Tomasi算子与1994年在文章 Good Features to Track [1]中提出,OpenCV 实现的算法的函数名定义为 goodFeaturesToTrack:

void goodFeaturesToTrack( InputArray image, OutputArray corners,
                                     int maxCorners, double qualityLevel, double minDistance,
                                     InputArray mask=noArray(), int blockSize=3,
                                     bool useHarrisDetector=false, double k=0.04 );

自定义使用函数(以方便createTrackbar的响应)如下:

void cornerShiTomasi_demo( int, void* )
{
  if( maxCorners < 1 ) { maxCorners = 1; }
  /// Parameters for Shi-Tomasi algorithm
  vector<Point2f> corners;
  double qualityLevel = 0.01;
  double minDistance = 10;
  int blockSize = 3;
  bool useHarrisDetector = false;
  double k = 0.04;
  /// Copy the source image
  Mat cormat;
  /// Apply corner detection :Determines strong corners on an image.
  goodFeaturesToTrack( src_gray, 
		       corners,
		       maxCorners,
		       qualityLevel,
		       minDistance,
		       Mat(),
		       blockSize,
		       useHarrisDetector,
		       k );
  /// Draw corners detected
  for( int i = 0; i < corners.size(); i++ ){	
	  circle( dst_norm_scaled,  corners[i], 5,  Scalar(255), 2, 8, 0 ); 
	  circle( src, corners[i], 4, Scalar(0,255,0), 2, 8, 0 ); 
  }

  /// Show what you got
  imshow( corners_window, dst_norm_scaled );
  imshow( source_window, src );  
}

 

实践

在主函数中定义两个进度条方便调整阈值:

  namedWindow( source_window, CV_WINDOW_AUTOSIZE );
  createTrackbar( "Threshold: ", source_window, &thresh, max_thresh, cornerHarris_demo );
  createTrackbar( "Max  corners:", source_window, &maxCorners, maxTrackbar, cornerShiTomasi_demo );  

  namedWindow( corners_window, CV_WINDOW_AUTOSIZE );
  namedWindow( source_window, CV_WINDOW_AUTOSIZE );
  imshow( source_window, src );  

  cornerHarris_demo( 0, 0 );
  cornerShiTomasi_demo( 0, 0 );


这里还需要说的是OpenCV 2.4.2中给的角点检测跟踪的示例代码有些问题,是应为SURF等不再定义在 feature2d模块中,而是legacy和nonfree,所以需要加入引用:

#include "opencv2/legacy/legacy.hpp"
#include "opencv2/nonfree/nonfree.hpp"

 

角点检测结果:

蓝色实心点为Harris检测结果,绿色空心圈为goodFeaturetoTrack检测结果。

M特征值分解后每个像素点相减的图(也就是Harris阈值判断的图)如下:

黑色实心点为Harris阈值检测结果,白色空心圈为阈值为27时Shi-Tomasi检测结果。

转载请注明出处:http://blog.csdn.net/xiaowei_cqu/article/details/7805206
源码及资料下载:http://download.csdn.net/detail/xiaowei_cqu/4466627

参考资料:

[1] Shi and C. Tomasi. Good Features to Track. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pages 593-600, June 1994.

[2] Richard Szeliski. Computer Vision: Algorithms and Applications. Springer, New York, 2010.

[3] 图像特征点提取PPT http://wenku.baidu.com/view/f61bc369561252d380eb6ef0.html

 

 

分享到:
评论

相关推荐

    Shi-tomasi角点检测,python实现及基于opencv实现,(角点检测、非极大值抑制)

    Shi-Tomasi角点检测算法,也称为Harris角点检测的改进版本,因其高效和准确性而广受欢迎。本文将深入探讨Shi-Tomasi角点检测的原理,并介绍如何用Python和OpenCV库来实现它。 **1. Shi-Tomasi角点检测原理** Shi-...

    Shi-Tomasi角点检测算法示例

    本示例通过OpenCV库在Visual Studio 2013环境下实现Shi-Tomasi角点检测。 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,包含了众多图像处理和计算机视觉的函数,广泛...

    C++OpenCV3源代码Shi-Tomasi角点检测

    ### C++ OpenCV3 源代码:Shi-Tomasi 角点检测 #### 一、概述 在计算机视觉领域,特征检测是一项基础而重要的技术。它可以帮助我们从图像中提取出有意义的信息,比如角点就是一种常用的特征点。Shi-Tomasi角点检测...

    Shi-Tomasi-corner-detector.zip

    **OpenCV中的Shi-Tomasi角点检测算法** OpenCV是一个强大的计算机视觉库,它提供了许多用于图像处理和计算机视觉任务的函数。在这些功能中,Shi-Tomasi角点检测是一种经典且广泛使用的算法,用于在图像中识别稳定、...

    OpenCV实现Shi-Tomasi角点检测(C++实现).zip

    OpenCV中的`goodFeaturesToTrack`不仅可以用于Shi-Tomasi角点检测,还可以切换到Harris角点检测算法,只需更改一个参数即可。 在机器学习领域,角点检测可以作为预处理步骤,帮助提取图像中的关键特征,用于训练...

    12 Shi-Tomasi角点检测.zip

    "12 Shi-Tomasi角点检测.zip"是一个与大学计算机专业Python-OpenCV项目实训相关的资源包,它包含了实现Shi-Tomasi(又称为Harris角点检测器)算法的源代码。这个算法是由Tuomas Shi和Christopher Tomasi在1994年提出...

    Shi-Tomasi角点检测、Harris角点检测

    环境win10+VS2017+Opencv2.4.13,配置环境不懂的可以在百度上搜索,Openc版本建议和我一致,新版的因为版权过期删掉了部分算法。使用方法:要用哪个算法就把对应的算法加入项目中,不可同时使用一个以上的算法,会报...

    OPENCV角点检测代码(图像)

    OpenCV(开源计算机视觉库)提供了多种角点检测算法,如Harris角点检测、Shi-Tomasi角点检测等。本文将详细解析一个基于OpenCV的角点检测代码示例,帮助初学者理解如何使用OpenCV进行角点检测。 #### 代码分析 此...

    OpenCV角点检测

    OpenCV是一个广泛使用的开源计算机视觉库,它提供了多种角点检测算法,如Harris角点检测、Shi-Tomasi(Good Features to Track)角点检测、Hessian矩阵为基础的快速角点检测(FAST)、基于梯度直方图的极值检测(ORB...

    角点检测 Opencv VC++

    Opencv是一个广泛使用的开源计算机视觉库,提供了多种角点检测算法,如Harris角点检测、Shi-Tomasi(Good Features to Track)算法等。本项目是基于VC++和MFC(Microsoft Foundation Classes)框架实现的一个角点...

    基于opencv的图像角点检测

    OpenCV提供了多种角点检测算法,如Harris角点检测、Shi-Tomasi(Good Features to Track)角点检测、Hessian矩阵以及更现代的FAST、BRIEF等。 1. Harris角点检测: 该方法由Richard Harris和Michael Stephens于...

    opencv角点检测

    OpenCV库提供了多种角点检测方法,包括Harris角点检测、Shi-Tomasi(又称为Good Features to Track)角点检测、Hessian矩阵检测等。其中,Harris角点检测是最早的、也是最经典的方法之一。该算法基于一个称为“角点...

    XCornerDetectionAlgorithm.rar_opencv corner_opencv 角点 检测_角点_角点检测

    OpenCV库中包含多种角点检测算法,例如Harris角点检测、Shi-Tomasi(Good Features to Track)算法以及更现代的FAST、BRIEF等。这些算法各有特点,适用于不同的应用场景。 本压缩包中的“12_1”文件可能是一个C++或...

    opencv获取图片角点

    角点检测是通过分析像素邻域的强度梯度来实现的,OpenCV库提供了多种角点检测算法,如Harris角点检测、Shi-Tomasi(又称为Good Features to Track)角点检测和Hessian矩阵为基础的角点检测。这些方法都能帮助我们...

    opencv c++ 实现harris角点检测

    在计算机视觉领域,角点检测是一项重要的基础任务,它用于识别图像中具有显著特征的点,这些点在图像变换中保持...同时,还可以结合其他方法,如 Shi-Tomasi 角点检测或FAST角点检测,来获得更全面的特征点检测结果。

    06OpenCVSharp 角点检测 检测平整度 代码仅供参考

    OpenCVSharp中提供了多种角点检测算法,如Harris角点检测、Shi-Tomasi(Good Features to Track)角点检测以及Hessian矩阵检测等。 首先,Harris角点检测是一种基于图像局部强度变化的角点检测方法。该算法通过计算...

    基于opencv的亚像素级角点检测

    OpenCV库提供了多种角点检测算法,如Harris角点检测、Shi-Tomasi(Good Features to Track)角点检测以及更现代的FAST、ORB等。其中,Harris角点检测是最早的、也是最经典的算法之一。该算法通过计算图像局部区域的...

    角点检测的方法

    2. **Shi-Tomasi(Good Features to Track)**:该方法改进了Harris角点检测,通过引入一个新的响应函数,选择具有最大主方向差异的特征作为角点。这种方法在保持稳定性的同时,能更精确地定位角点。 3. **Hessian...

    corner_opencv.rar_OPENCV 角点_opencv corner_特征点_特征点提取

    OpenCV库提供了多种角点检测算法,如Harris角点检测、Shi-Tomasi(Good Features to Track)角点检测、FAST(Features from Accelerated Segment Test)以及ORB(Oriented FAST and Rotated BRIEF)等。 1. Harris...

    OpenCV图象角点检测实例

    在计算机视觉领域,角点检测是一项重要的技术,用于识别图像中的...在实践中,你还可以尝试其他的角点检测算法,如Shi-Tomasi、Harris-Laplace、FAST、ORB等,比较它们的性能和效果,以选择最适合你的应用场景的方法。

Global site tag (gtag.js) - Google Analytics