#include<stdio.h> #include"cv.h" #include"highgui.h" #define max_corners 100 int main(int argc,char **argv) { int cornerCount=max_corners; CvPoint2D32f corners[max_corners]; IplImage *srcImage =0,*grayImage =0,*corners1=0,*corners2=0; int i; CvScalar color = CV_RGB(255,0,0); char *filename = argc ==2?argv[1]:(char*)"lebron.jpg"; cvNamedWindow("image",1); srcImage = cvLoadImage(filename,1); grayImage =cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_8U,1); cvCvtColor(srcImage,grayImage,CV_BGR2GRAY); corners1= cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_32F,1); corners2= cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_32F,1); cvGoodFeaturesToTrack(grayImage,corners1,corners2,corners,&cornerCount,0.05,5,0,3,0,0.4); printf("num corners found:%d\n",cornerCount); if(cornerCount>0) { for(i=0;i<cornerCount;i++) { cvCircle(srcImage,cvPoint((int)(corners[i].x),(int)(corners[i].y)),6,color,2,CV_AA,0); } } cvShowImage("image",srcImage); cvReleaseImage(&srcImage); cvReleaseImage(&grayImage); cvReleaseImage(&corners1); cvReleaseImage(&corners2); cvWaitKey(0); return 0; }
角点特征是图像特征思路中的一种,角点是图像的另一个重要的局部特征,其直观定义是指在至少两个方向上图像灰度变化均较大的点。在实际图像中,轮廓的拐角、线段的末端等都是角点。角点特征因具有信息量丰富、便于测量和表示、能够适应环境光照变化、尤其适用于处理遮挡和几何变形问题等优点而成为许多特征匹配算法的首选。
角点检测方法分为基于直接像素灰度比较的方法和求轮廓弧度极值的方法。
一种非线性的边缘、角点提取方法一SUSAN算法(Smallest Univalue Segment Assimilating Nucleus )在中文文献中被翻译作“最小同值吸收核”。该算法包括五步,在像素周围放置一圆形模板,计算同值区域,设定一闭值并减去区域大小以得到角点强度图,分析USAN区域的重心及连接性以去掉假角点,使用非极大值抑制方法来寻找最终角点。算法对噪声不敏感,但其计算较复杂。
角点检测的第二类方法是,首先对图像求边缘或轮廓,比如使用算法然后求该轮廓上的局部弧度最大值就可以确定角点的位置。但这种方法往往具有定位不准的弊病,其角点定位能力非常依赖于边缘检测的结果。
下面介绍HARRIS算子及c++的