opencv-harris和shi-tomasi角点检测
2015-09-16 18:24
375 查看
角点
特征检测与匹配是Computer Vision 应用总重要的一部分,这需要寻找图像之间的特征建立对应关系。点,也就是图像中的特殊位置,是很常用的一类特征,点的局部特征也可以叫做“关键特征点”(keypoint feature),或“兴趣点”(interest point),或“角点”(conrner)。关于角点的具体描述可以有几种:
一阶导数(即灰度的梯度)的局部最大所对应的像素点;
两条及两条以上边缘的交点;
图像中梯度值和梯度方向的变化速率都很高的点;
角点处的一阶导数最大,二阶导数为零,指示物体边缘变化不连续的方向。
Harris角点检测
当一个窗口在图像上移动,在平滑区域如图(a),窗口在各个方向上没有变化。在边缘上如图(b),窗口在边缘的方向上没有变化。在角点处如图(c),窗口在各个方向上具有变化。Harris角点检测正是利用了这个直观的物理现象,通过窗口在各个方向上的变化程度,决定是否为角点。![](http://my.csdn.net/uploads/201207/31/1343708912_3784.png)
将图像窗口平移[u,v]产生灰度变化E(u,v)
![](http://my.csdn.net/uploads/201207/31/1343708998_9792.png)
由:
![](http://my.csdn.net/uploads/201207/31/1343709165_2641.png)
, 得到:
![](http://my.csdn.net/uploads/201207/31/1343709181_9241.png)
对于局部微小的移动量 [u,v],近似表达为:
![](http://my.csdn.net/uploads/201207/31/1343709271_9076.png)
其中M是 2*2 矩阵,可由图像的导数求得:
![](http://my.csdn.net/uploads/201207/31/1343709356_8760.png)
E(u,v)的椭圆形式如下图:
![](http://my.csdn.net/uploads/201207/31/1343709660_5258.png)
定义角点响应函数 R 为:
![](http://my.csdn.net/uploads/201207/31/1343709802_8304.png)
Harris角点检测算法就是对角点响应函数R进行阈值处理:R > threshold,即提取R的局部极大值。
【相关代码】
OpenCV中定义了 cornerHarris 函数:[cpp] view
plaincopy
void cornerHarris( InputArray src, OutputArray dst, int blockSize,
int ksize, double k,
int borderType=BORDER_DEFAULT );
可以结合 convertScaleAbs 函数,通过阈值取角点:
[cpp] view
plaincopy
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 进行特征值分析,产生两个特征值
![](http://my.csdn.net/uploads/201207/31/1343711271_9118.png)
和两个特征方向向量。因为较大的不确定度取决于较小的特征值,也就是
![](http://my.csdn.net/uploads/201207/31/1343711386_9399.png)
,所以通过寻找最小特征值的最大值来寻找好的特征点也就解释的通了。
Shi 和Tomasi 的方法比较充分,并且在很多情况下可以得到比使用Harris 算法更好的结果。
【相关代码】
由于这种Shi-Tomasi算子与1994年在文章 Good Features to Track [1]中提出,OpenCV 实现的算法的函数名定义为 goodFeaturesToTrack:[cpp] view
plaincopy
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的响应)如下:
[cpp] view
plaincopy
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 );
}
实践
在主函数中定义两个进度条方便调整阈值:[cpp] view
plaincopy
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,所以需要加入引用:
[cpp] view
plaincopy
#include "opencv2/legacy/legacy.hpp"
#include "opencv2/nonfree/nonfree.hpp"
角点检测结果:
![](http://my.csdn.net/uploads/201207/31/1343712320_9626.png)
蓝色实心点为Harris检测结果,绿色空心圈为goodFeaturetoTrack检测结果。
M特征值分解后每个像素点相减的图(也就是Harris阈值判断的图)如下:
![](http://my.csdn.net/uploads/201207/31/1343712544_1407.png)
黑色实心点为Harris阈值检测结果,白色空心圈为阈值为27时Shi-Tomasi检测结果。
转载请注明出处:/article/1357509.html
源码及资料下载: 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
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关文章推荐
- 例题 6-6 小球下落(Dropping Balls) UVa 679 二叉树规律
- Linux下,telnet命令如何退出
- BASH第八课作业
- CentOS postgresql9.4
- ORM对象关系映射之GreenDAO自定义属性转换器PropertyConverter
- ORM对象关系映射之GreenDAO自定义属性转换器PropertyConverter
- 在Linux执行命令报错”Arg list too long”的原因分析
- Linux之定时器与时间管理 【转】
- OpenStack路: OpenStack建筑设计指南 - 概要(摘录和翻译)
- linux下使用AES cbc加解密文件源码,支持所有类型文件
- Linux内核驱动之延时 【转】
- centos 文本排序
- ubuntu tomcat的安装与配置
- tomcat 使用conf中的service.xml发布项目报错500
- icloud之部署架构
- LNMP之Nginx反向代理负载均衡(二)
- Linux 编程学习笔记----动笔makefile档
- 用Kali Linux动态shellcode注入工具:Shellter 4.0 绕过反病毒软件
- AJAX控制DropDownList两级联动
- shell的一些应用场景