cvGoodFeaturesToTrack
编辑
GoodFeaturesToTrack
确定图像的强角点
void cvGoodFeaturesToTrack( const CvArr* image, CvArr* eig_image, CvArr* temp_image,
CvPoint2D32f* corners, int* corner_count,
double quality_level, double min_distance,
const CvArr* mask=NULL,
int block_size = NULL,
int use_harris = 0,
double k = 0.4
);
image
输入图像,8-位或浮点32-比特,单通道
eig_image
临时浮点32-位图像,尺寸与输入图像一致
temp_image
另外一个临时图像,格式与尺寸与 eig_image 一致
corners
输出参数,检测到的角点
corner_count
输出参数,检测到的角点数目
quality_level
最大最小特征值的乘法因子。定义可接受图像角点的最小质量因子。
min_distance
限制因子。得到的角点的最小距离。使用 Euclidian 距离
mask
ROI:感兴趣区域。函数在ROI中计算角点,如果 mask 为 NULL,则选择整个图像。
函数 cvGoodFeaturesToTrack 在图像中寻找具有大特征值的角点。该函数,首先用cvCornerMinEigenVal 计算输入图像的每一个像素点的最小特征值,并将结果存储到变量 eig_image 中。然后进行非最大值抑制(仅保留3x3邻域中的局部最大值)。下一步将最小特征值小于 quality_level?max(eig_image(x,y)) 排除掉。最后,函数确保所有发现的角点之间具有足够的距离,(最强的角点第一个保留,然后检查新的角点与已有角点之间的距离大于 min_distance )。
block_size[1]
是计算导数的自相关矩阵时指定点的领域,采用小窗口计算的结果比单点(也就是block_size为1)计算的结果要好。
use_harris
标志位。当use_harris的值为非0,则函数使用Harris的角点定义;若为0,则使用Shi-Tomasi的定义。
k
当use_harris为k且非0,则k为用于设置Hessian自相关矩阵即对Hessian行列式的相对权重的权重系数。
实现的代码如下所示:实用前请配置Opencv。
#include "cv.h"
#include "highgui.h"
#include "stdio.h"
#define max_corners 50
int main( int argc, char** argv )
{
int cornerCount=max_corners;
CvPoint2D32f corners[max_corners];
double qualityLevel = 0.05;
double minDistance = 5;
IplImage *srcImage = 0, *grayImage = 0, *corners1 = 0, *corners2 = 0;
int i;
CvScalar color = CV_RGB(255,0,0);
cvNamedWindow( "image", 1 ); //创建显示窗口
//加载一副图片
srcImage = cvLoadImage("F:\\新建文件夹\\imagetodep\\imagetodep\\3.2.jpg", 1); //为你图片存放的位置
grayImage = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 1);
//将原图灰度化
cvCvtColor(srcImage, grayImage, CV_BGR2GRAY);
//创建2个与原图大小相同的临时图像
corners1= cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_32F, 1);
corners2= cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_32F, 1);
//角点检测
cvGoodFeaturesToTrack (grayImage, corners1, corners2, corners,
&cornerCount, qualityLevel, minDistance, 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)), 6,
color, 2, CV_AA, 0);
}
}
cvShowImage( "image", srcImage );
cvReleaseImage(&srcImage);
cvReleaseImage(&grayImage);
cvReleaseImage(&corners1);
cvReleaseImage(&corners2);
cvWaitKey(0);
return 0;
}