角点

特征检测与匹配是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 函数:

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

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

  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:

  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的响应)如下:

  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. }

实践

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

  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,所以需要加入引用:

  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

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

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

    本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/29356187 作者:毛星云(浅墨) ...

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

    Harris.Shi-Tomasi和亚像素角点都是角点,隶属于特征点这个大类(特征点可以分为边缘.角点.斑点). 一.Harris角点检测是一种直接基于灰度图像的角点提取算法,稳定性较高,但是也可能出 ...

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

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

  4. uniapp云打包之后华为手机推送角标不显示(有推送没角标)

    小米手机上有角标,华为和OPPO没有角标 解决方法: 华为手机添加权限(可通过反编译或者离线打包添加) < uses - permission android:name="com.hu ...

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

     Hough Forest目标检测一种比较时兴的目标检测算法,Juergen Gall在2009的CVPR上提出. Hough Forest听上去像hough变换+Random Forest的结合体, ...

  6. 实时检测微信域名防红拦截检测API系统,最新腾讯域名屏蔽检测官方接口

    最近手里有个项目需要检测域名在微信里是否可以打开,如果被微信拦截,则需要进行下一步操作,所以需要判断域名的状态,但是微信官方并没有提供相关查询的方法,最后在网上找到了这个接口地址,分享给有需要的朋友. ...

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

    #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...

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

    image算法测试iteratoralgorithmfeatures 原创文章,转载请注明出处:http://blog.csdn.net/crzy_sparrow/article/details/73 ...

  9. OpenCV教程(45) harris角的检测(3)

          在前面一篇教程中,我们通过取局部最大值的方法来处理检测结果,但是从图像中可以看到harris角的分布并不均匀,在纹理颜色比较深的地方检测的harris角结果更密集一些.本章中,我们使用一个 ...

  10. Harris角点及Shi-Tomasi角点检测(转)

    一.角点定义 有定义角点的几段话: 1.角点检测(Corner Detection)是计算机视觉系统中用来获得图像特征的一种方法,广泛应用于运动检测.图像匹配.视频跟踪.三维建模和目标识别等领域中.也 ...

随机推荐

  1. MyBatis-Plus 3.0.7.1

    1 .分页配置 <plugins> <plugin interceptor="com.baomidou.mybatisplus.plugins.PaginationInte ...

  2. 黑马程序员_java基础笔记(01)...java的环境搭建

    —————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流!——————————  JavaSE(Java Standard Edtion java标准版)技术概况 ...

  3. Ruby windows7安装配置(最新版本)

    1.下载最新版本的rubyinstaller并安装http://rubyinstaller.org/downloads/ 如下图所示设置路径,我安装时将所有选项都打够了,免除了后面需要什么配置麻烦. ...

  4. 如何让 C++ 和 C# 一样易用,而且效率更高?

    (未完成,待续..) 第一章:C++基本功 1. 养成良好的编码习惯. 2. 堆上的资源随用随还,严格控制生命周期. 第二章:一些调试心得 1. 在VisualStudio环境下,曾出现 Detect ...

  5. JAVAEE——宜立方商城01:电商行业的背景、商城系统架构、后台工程搭建、SSM框架整合

    1. 学习计划 第一天: 1.电商行业的背景. 2.宜立方商城的系统架构 a) 功能介绍 b) 架构讲解 3.工程搭建-后台工程 a) 使用maven搭建工程 b) 使用maven的tomcat插件启 ...

  6. [leetcode DP]70. Climbing Stairs

    一共有n个台阶,每次跳一个或者两个,有多少种走法,典型的Fibonacii问题 class Solution(object): def climbStairs(self, n): if n<0: ...

  7. 机器学习之路: tensorflow 一个最简单的神经网络

    git: https://github.com/linyi0604/MachineLearning/tree/master/07_tensorflow/ import tensorflow as tf ...

  8. TS Stream 详解

    <什么是TS>     TS(transport stream) , TS流文件,是一种DVD的文件格式,TS格式的特点就是要求从视频流的任一片段开始都是可以独立解码的,这种特性就决定了T ...

  9. 【BZOJ 2318】 2318: Spoj4060 game with probability Problem(概率DP)

    2318: Spoj4060 game with probability Problem Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 371  Sol ...

  10. UOJ.87.mx的仙人掌(圆方树 虚树)(未AC)

    题目链接 本代码10分(感觉速度还行..). 建圆方树,预处理一些东西.对询问建虚树. 对于虚树上的圆点直接做:对于方点特判,枚举其所有儿子,如果子节点不在该方点代表的环中,跳到那个点并更新其val, ...