角点检测: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 函数:

[cpp] view plaincopy

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

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

[cpp] view plaincopy

  1. void cornerHarris_demo( int, void* )
  2. {
  3. Mat dst, dst_norm;
  4. dst = Mat::zeros( src.size(), CV_32FC1 );
  5. /// Detector parameters
  6. int blockSize = 2;
  7. int apertureSize = 3;
  8. double k = 0.04;
  9. /// Detecting corners
  10. cornerHarris( src_gray, dst, blockSize, apertureSize, k, BORDER_DEFAULT );
  11. /// Normalizing
  12. normalize( dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat() );
  13. convertScaleAbs( dst_norm, dst_norm_scaled );
  14. /// Drawing a circle around corners
  15. for( int j = 0; j < dst_norm.rows ; j++ )
  16. { for( int i = 0; i < dst_norm.cols; i++ )
  17. {
  18. if( (int) dst_norm.at<float>(j,i) > thresh )
  19. {
  20. circle( dst_norm_scaled, Point( i, j ), 5,  Scalar(0), 2, 8, 0 );
  21. circle(src,Point( i, j ), 5,  Scalar(255,0,0), -1, 8, 0 );
  22. }
  23. }
  24. }
  25. /// Showing the result
  26. imshow( corners_window, dst_norm_scaled );
  27. imshow( source_window, src );
  28. }

Shi-Tomasi 算法

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

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

【相关代码】

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

[cpp] view plaincopy

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

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

[cpp] view plaincopy

  1. void cornerShiTomasi_demo( int, void* )
  2. {
  3. if( maxCorners < 1 ) { maxCorners = 1; }
  4. /// Parameters for Shi-Tomasi algorithm
  5. vector<Point2f> corners;
  6. double qualityLevel = 0.01;
  7. double minDistance = 10;
  8. int blockSize = 3;
  9. bool useHarrisDetector = false;
  10. double k = 0.04;
  11. /// Copy the source image
  12. Mat cormat;
  13. /// Apply corner detection :Determines strong corners on an image.
  14. goodFeaturesToTrack( src_gray,
  15. corners,
  16. maxCorners,
  17. qualityLevel,
  18. minDistance,
  19. Mat(),
  20. blockSize,
  21. useHarrisDetector,
  22. k );
  23. /// Draw corners detected
  24. for( int i = 0; i < corners.size(); i++ ){
  25. circle( dst_norm_scaled,  corners[i], 5,  Scalar(255), 2, 8, 0 );
  26. circle( src, corners[i], 4, Scalar(0,255,0), 2, 8, 0 );
  27. }
  28. /// Show what you got
  29. imshow( corners_window, dst_norm_scaled );
  30. imshow( source_window, src );
  31. }

实践

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

[cpp] view plaincopy

  1. namedWindow( source_window, CV_WINDOW_AUTOSIZE );
  2. createTrackbar( "Threshold: ", source_window, &thresh, max_thresh, cornerHarris_demo );
  3. createTrackbar( "Max  corners:", source_window, &maxCorners, maxTrackbar, cornerShiTomasi_demo );
  4. namedWindow( corners_window, CV_WINDOW_AUTOSIZE );
  5. namedWindow( source_window, CV_WINDOW_AUTOSIZE );
  6. imshow( source_window, src );
  7. cornerHarris_demo( 0, 0 );
  8. cornerShiTomasi_demo( 0, 0 );

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

[cpp] view plaincopy

  1. #include "opencv2/legacy/legacy.hpp"
  2. #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

时间: 2024-10-15 21:53:59

角点检测:Harris角点及Shi-Tomasi角点检测的相关文章

【OpenCV十六新手教程】OpenCV角检测Harris角点检测

本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/29356187 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本号: 2.4.9 本篇文章中,我们一起探讨了OpenCV

寻找Harris、Shi-Tomasi和亚像素角点

Harris.Shi-Tomasi和亚像素角点都是角点,隶属于特征点这个大类(特征点可以分为边缘.角点.斑点). 一.Harris角点检测是一种直接基于灰度图像的角点提取算法,稳定性较高,但是也可能出现有用信息丢失的情况. 函数:cornerHarris() void cv::cornerHarris ( InputArray  src,  //需要为8位单通道     OutputArray  dst,  //结果     int  blockSize, //领域大小     int  ksi

Opencv图像识别从零到精通(33)----moravec角点、harris角点

一.角点 图像处理和与计算机视觉领域,兴趣点(interest points),或称作关键点(keypoints).特征点(feature points) 被大量用于解决物体识别,图像识别.图像匹配.视觉跟踪.三维重建等一系列的问题.我们不再观察整幅图,而是选择某些特殊的点,然后对他们进行局部有的放矢的分析.如果能检测到足够多的这种点,同时他们的区分度很高,并且可以精确定位稳定的特征,那么这个方法就有使用价值. 图像特征类型可以被分为如下三种: <1>边缘                   

shift + 空格 快捷键 使输入法 在全角和半角直接切换。。 但是全角输入一个 空格 ,会造成jsp页面 无法正常解析。。比如 无法获得参数。。

shift + 空格 快捷键 使输入法 在全角和半角直接切换.. 但是全角输入一个 空格 ,会造成jsp页面 无法正常解析....比如 无法获得参数.. 如 <form action="/mycenter/topicRelated" name="pageForm" method="post"> <input type="hidden" value="${pageBean.currentPage }&

『python』计算机视觉_OpenCV3角点特征Harris提取方法

因为当下的计划是熟悉语言和库,而图像特征提取脱离理论就很没意思了,并且很可能事倍功半,所以计算机视觉特征提取这部分跳过,直接开始和深度学习结合较为紧密的目标检测&识别部分. 本节介绍了OpenCV3中提取图像角点特征的函数: 1 # coding=utf-8 2 import cv2 3 import numpy as np 4 5 6 '''Harris算法角点特征提取''' 7 8 img = cv2.imread('chess_board.png') 9 gray = cv2.cvtCol

微信号码检测软件如何选择?2016年微信开通检测软件升级版使用教程

一.简介      微信号码检测软件是由急速利用微信搜索技术,自主研发而成的,为微信营销用户研发的一款全新软件.微信开通检测自上市以来,秉承全心全意为客户服务的宗旨,获得了市场普遍的信任和青睐,目前已成长为微信开通检测业界中受用户信赖的首选软件. 二.如何选择?    1.检测的号码范围       一般的能够检测手机号码,QQ,邮箱,现在急速的还能够检测字母数字组合,只要是微信账号都能够进行批量的检测:    2.操作界面的简洁度       操作界面复杂繁琐会让降低用户的效率,急速全新的操作

以一个闰年检测程序为例的非法字符异常输入检测

闰年:闰年(Leap Year)是为了弥补认为历法规定造成的年度天数与地球实际公转周期的时间差而设立的.补上时间差的年份为闰年. 简单来说,置润法则是:四年一闰,百年不闰,四百年再闰.即规定公历年份是整百数的,必须是400的倍数才是闰年,不是400的倍数的就是平年. 例如:1950-2050年间的闰年: 1952,1956,1960,1964,1968,1972,1976,1980,1984,1988,1992,1996,2000, 2004,2008,2012,2016,2020,2024,2

目标检测之hough forest---霍夫森林(Hough Forest)目标检测算法

 Hough Forest目标检测一种比较时兴的目标检测算法,Juergen Gall在2009的CVPR上提出. Hough Forest听上去像hough变换+Random Forest的结合体,其实,不完全是这样的.它更像是decision forest和regression forest的结合体再加上generalized hough transform:森林中每棵树即不是分类树也不是回归树,而是其中的每个节点可能为分类节点或者回归节点.分类节点最小化class-label uncert

OpenCV——Harris、Shi Tomas、自定义、亚像素角点检测

在图像处理和与计算机视觉领域,兴趣点(interest points),或称作关键点(keypoints).特征点(feature points) 被大量用于解决物体识别,图像识别.图像匹配.视觉跟踪.三维重建等一系列的问题.我们不再观察整幅图,而是选择某些特殊的点,然后对他们进行局部有的放矢的分析.如果能检测到足够多的这种点,同时他们的区分度很高,并且可以精确定位稳定的特征,那么这个方法就有使用价值. 图像特征类型可以被分为如下三种: <1>边缘 <2>角点 (感兴趣关键点) &

Opencv学习笔记--Harris角点检测

image算法测试iteratoralgorithmfeatures 原创文章,转载请注明出处:http://blog.csdn.net/crzy_sparrow/article/details/7391511 文章目录: 一.Harris角点检测基本理论 二.opencv代码实现 三.改进的Harris角点检测 四.FAST角点检测 五.参考文献 六.附录(资料和源码) 一.Harris角点检测基本理论(要讲清楚东西太多,附录提供文档详细说明) 1.1 简略表达: 角点:最直观的印象就是在水平