GoodFeaturesToTrack函数

来源:互联网 发布:网络玩私彩犯法吗 编辑:程序博客网 时间:2024/06/05 11:22

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;
  }

转载:http://baike.baidu.com/link?url=IK-llB2HSup3USGUKYynfup7bp5DoCwafJX1txQXuOy51TXj-4Ymi0cA0De83aX6ip1LBjUlw-ScPuKJIWmzhK

0 0
原创粉丝点击