- 浏览: 281028 次
- 性别:
- 来自: 济南
文章分类
最新评论
角点
特征检测与匹配是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
发表评论
-
unity基础开发----物体位移和旋转实用代码
2013-11-21 22:46 1271using UnityEngine; using Syst ... -
android 动态时钟 附源码
2013-09-24 12:03 1285自定义View实践 例子代码 自定义动态时钟 ... -
android Dialog 背景问题
2013-08-14 11:22 1207我们在使用自定义的Dialog的时候,喜欢自己 ... -
ScrollView scrollTo 的使用 动画效果
2013-08-05 17:43 4605今天用到了ScrollView scrollTo方法 ... -
Android中View绘制优化之一---- 优化布局层次
2012-09-04 23:00 1076... -
Android中View绘制优化二一---- 使用<include />标签复用布局文件
2012-09-08 13:54 1057... -
Android中View绘制优化之三---- 优化View
2012-09-13 21:00 1085... -
兰林任务管理应用程序雏形版以及概要说明
2012-09-15 21:54 881... -
Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(上)
2012-10-10 18:14 1169... -
Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)
2012-10-17 20:05 862... -
Android中文件选择器的实现
2012-11-30 08:59 1175... -
【编译原理】使用Lex将C/C++文件输出为HTML文件
2012-07-20 09:37 107408年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ... -
【编译原理】正则表达式
2012-07-21 21:49 230708年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ... -
【OpenCV】访问Mat图像中每个像素的值
2012-07-22 07:10 1174今天百度搜资料还搜到了自己的。。。《访问图像中每个像素的值 ... -
【编译原理】用Yacc做语法分析
2012-07-23 05:47 177708年9月入学,12年7月毕 ... -
【UML】UML几种图的绘制
2012-07-24 09:49 99108年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ... -
【OpenCV】邻域滤波:方框、高斯、中值、双边滤波
2012-07-26 10:52 1461邻域滤波(卷积) 邻域算子值利用给定像素 ... -
【数据结构】排序算法:希尔、归并、快速、堆排序
2012-07-28 06:15 102708年9月入学,12年7月毕 ... -
【UML】案例分析:机场运作系统
2012-08-01 17:22 313708年9月入学,12年7月毕 ... -
【OpenCV】边缘检测:Sobel、拉普拉斯算子
2012-08-04 13:41 1549边缘 边缘(edge)是指图像局部强度变化最显著的部分。主要 ...
相关推荐
Shi-Tomasi角点检测算法,也称为Harris角点检测的改进版本,因其高效和准确性而广受欢迎。本文将深入探讨Shi-Tomasi角点检测的原理,并介绍如何用Python和OpenCV库来实现它。 **1. Shi-Tomasi角点检测原理** Shi-...
本示例通过OpenCV库在Visual Studio 2013环境下实现Shi-Tomasi角点检测。 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,包含了众多图像处理和计算机视觉的函数,广泛...
### C++ OpenCV3 源代码:Shi-Tomasi 角点检测 #### 一、概述 在计算机视觉领域,特征检测是一项基础而重要的技术。它可以帮助我们从图像中提取出有意义的信息,比如角点就是一种常用的特征点。Shi-Tomasi角点检测...
**OpenCV中的Shi-Tomasi角点检测算法** OpenCV是一个强大的计算机视觉库,它提供了许多用于图像处理和计算机视觉任务的函数。在这些功能中,Shi-Tomasi角点检测是一种经典且广泛使用的算法,用于在图像中识别稳定、...
OpenCV中的`goodFeaturesToTrack`不仅可以用于Shi-Tomasi角点检测,还可以切换到Harris角点检测算法,只需更改一个参数即可。 在机器学习领域,角点检测可以作为预处理步骤,帮助提取图像中的关键特征,用于训练...
"12 Shi-Tomasi角点检测.zip"是一个与大学计算机专业Python-OpenCV项目实训相关的资源包,它包含了实现Shi-Tomasi(又称为Harris角点检测器)算法的源代码。这个算法是由Tuomas Shi和Christopher Tomasi在1994年提出...
环境win10+VS2017+Opencv2.4.13,配置环境不懂的可以在百度上搜索,Openc版本建议和我一致,新版的因为版权过期删掉了部分算法。使用方法:要用哪个算法就把对应的算法加入项目中,不可同时使用一个以上的算法,会报...
OpenCV(开源计算机视觉库)提供了多种角点检测算法,如Harris角点检测、Shi-Tomasi角点检测等。本文将详细解析一个基于OpenCV的角点检测代码示例,帮助初学者理解如何使用OpenCV进行角点检测。 #### 代码分析 此...
OpenCV是一个广泛使用的开源计算机视觉库,它提供了多种角点检测算法,如Harris角点检测、Shi-Tomasi(Good Features to Track)角点检测、Hessian矩阵为基础的快速角点检测(FAST)、基于梯度直方图的极值检测(ORB...
Opencv是一个广泛使用的开源计算机视觉库,提供了多种角点检测算法,如Harris角点检测、Shi-Tomasi(Good Features to Track)算法等。本项目是基于VC++和MFC(Microsoft Foundation Classes)框架实现的一个角点...
OpenCV提供了多种角点检测算法,如Harris角点检测、Shi-Tomasi(Good Features to Track)角点检测、Hessian矩阵以及更现代的FAST、BRIEF等。 1. Harris角点检测: 该方法由Richard Harris和Michael Stephens于...
OpenCV库提供了多种角点检测方法,包括Harris角点检测、Shi-Tomasi(又称为Good Features to Track)角点检测、Hessian矩阵检测等。其中,Harris角点检测是最早的、也是最经典的方法之一。该算法基于一个称为“角点...
OpenCV库中包含多种角点检测算法,例如Harris角点检测、Shi-Tomasi(Good Features to Track)算法以及更现代的FAST、BRIEF等。这些算法各有特点,适用于不同的应用场景。 本压缩包中的“12_1”文件可能是一个C++或...
角点检测是通过分析像素邻域的强度梯度来实现的,OpenCV库提供了多种角点检测算法,如Harris角点检测、Shi-Tomasi(又称为Good Features to Track)角点检测和Hessian矩阵为基础的角点检测。这些方法都能帮助我们...
在计算机视觉领域,角点检测是一项重要的基础任务,它用于识别图像中具有显著特征的点,这些点在图像变换中保持...同时,还可以结合其他方法,如 Shi-Tomasi 角点检测或FAST角点检测,来获得更全面的特征点检测结果。
OpenCVSharp中提供了多种角点检测算法,如Harris角点检测、Shi-Tomasi(Good Features to Track)角点检测以及Hessian矩阵检测等。 首先,Harris角点检测是一种基于图像局部强度变化的角点检测方法。该算法通过计算...
OpenCV库提供了多种角点检测算法,如Harris角点检测、Shi-Tomasi(Good Features to Track)角点检测以及更现代的FAST、ORB等。其中,Harris角点检测是最早的、也是最经典的算法之一。该算法通过计算图像局部区域的...
2. **Shi-Tomasi(Good Features to Track)**:该方法改进了Harris角点检测,通过引入一个新的响应函数,选择具有最大主方向差异的特征作为角点。这种方法在保持稳定性的同时,能更精确地定位角点。 3. **Hessian...
OpenCV库提供了多种角点检测算法,如Harris角点检测、Shi-Tomasi(Good Features to Track)角点检测、FAST(Features from Accelerated Segment Test)以及ORB(Oriented FAST and Rotated BRIEF)等。 1. Harris...
在计算机视觉领域,角点检测是一项重要的技术,用于识别图像中的...在实践中,你还可以尝试其他的角点检测算法,如Shi-Tomasi、Harris-Laplace、FAST、ORB等,比较它们的性能和效果,以选择最适合你的应用场景的方法。