OpenCV角点检测小结
1,cvGoodFeaturesToTrack,cvCornerMinEigenVal,CornerEigenValsAndVecs是一类,用到了图像差分的相关矩阵。
2,CornerHarris,利用CornerEigenValsAndVecs得到的图像差分相关矩阵,据其特征值和向量,判断角点, Harris角点探测器R(x,y)=det(M)-k*trace^2(M)
3,FindCornerSubPix,子象素级角点定位的实现是基于对向量正交性的观测而实现的。貌似适合棋盘格特征点检测,有待研究。
4,cvPreCornerDetect,计算一个二阶导多项式,角点被认为是函数的局部最大值。其实就是K-R法,利用了梯度的变化率在边缘走 向的投影能反映尖锐程度。试验发现是一种比cvGoodFeaturesToTrack粗略的办法。
注意:1,2,4都是检测像素级的角点。
- #include "stdafx.h"
- #include "cv.h"
- #include "highgui.h"
- #include "cxcore.h"
- #define max_corners 500
- int _tmain(int argc, _TCHAR* argv[])
- {
- int cornerCount=max_corners;
- CvPoint2D32f corners[max_corners];
- double qualityLevel;
- double minDistance;
- IplImage *srcImage = 0, *grayImage = 0, *corners1 = 0, *corners2 = 0;
- int i;
- CvScalar color = CV_RGB(255,0,0);
- cvNamedWindow( "image", 1 ); // 创建名为“image”的HighGUI窗口
- //加载要处理的图像
- srcImage = cvLoadImage("D://zero//VasoR.bmp",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);
- 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)), 1,
- color, 2, CV_AA, 0);
- }
- }
- cvShowImage( "image", srcImage );
- cvWaitKey(0); // 等待钥匙。功能有
- cvDestroyWindow("image");
- cvReleaseImage(&srcImage);
- cvReleaseImage(&grayImage);
- cvReleaseImage(&corners1);
- cvReleaseImage(&corners2);
- return 0;
- }