角点

特征检测与匹配是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. Web Api 的 路由机制

    ASP.NET Web API 是一种框架,用于轻松构建可以访问多种客户端(包括浏览器和移动设备)的 HTTP 服务. ASP.NET Web API 是一种用于在 .NET Framework 上构 ...

  2. curl之采集QQ空间留言

    目录 主要流程解析 注意事项 扩展 完整代码示例 采集效果一览 主要流程解析 首先,打开浏览器登录QQ空间并访问留言列表 由于QQ空间的链接是https,curl方式请求https链接需要突破http ...

  3. Revit二次开发示例:ChangesMonitor

    在本示例中,程序监控Revit打开文件事件,并在创建的窗体中更新文件信息.   #region Namespaces using System; using System.Collections.Ge ...

  4. mysql常见知识点

    最近整理了一些数据库常见的面试题,对自己也是个复习,希望对大家也有所帮助. 1.触发器的作用? 触发器是一类特殊的存储过程,主要是通过事件来触发而被执行的.它可以强化约束,来维护数据的完整性和一致性, ...

  5. [ 原创 ]学习笔记-Android中隐式Intent 的使用

    Android中Intent的使用分为显示Intent和隐式Intent 之前已经介绍过显示Intent的用法了,今天来介绍一下隐式Intent的用法. 当我们在使用一款软件时,如果需要从该软件内部开 ...

  6. navicat premium 的使用——navicat 连接MySQL数据库

    最近,在学习navicat premium这款第三方软件,他是一个三方数据库管理软件,在前一段时间实习的时候,我使用这款软件调用过服务器上的数据库,不过,当时并没有仔细研究,再次遇到这个软件,我决定仔 ...

  7. android 注册广播接受者

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 动态注册 静态注册 动态注册是 通过java代码,注册. 静态注册 是xml清单文件中 ...

  8. 详解Android基本布局

    一.线性布局 LinearLayout又称为线性布局,是一种非常常用的布局.这个布局会将它包含的控件在线性方向上依次排列.我们可以通过指定它的orientation属性来决定它是垂直方向排列还是水平方 ...

  9. win7 64位安装pywin32

    先安装pywin32-218.win-amd64-py3.4.exe文件: 安装完成后,用CMD管理员模式进入\Python34\Scripts\目录 输入pywin32_postinstall.py ...

  10. HDU 5154 Harry and Magical Computer bfs

    Harry and Magical Computer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...