角点检测方法

来源:互联网 发布:config.inc.php下载 编辑:程序博客网 时间:2024/05/17 22:31

TrackingMotion\cornerDetector_Demo.cpp, cornerHarris_Demo.cpp , cornerSubPix_Demo.cpp, goodFeaturesToTrack_Demo.cpp

Harris角点检测

步骤:

1、灰度化

2、二值化

3、角点检测:cornerHarris( src_gray, dst, blockSize, apertureSize, k, BORDER_DEFAULT );

4、角点归一化:normalize( dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat() );

5、范围处理:convertScaleAbs( dst_norm, dst_norm_scaled );

6、绘制角点:circle( dst_norm_scaled, Point( i, j ), 5,  Scalar(0), 2, 8, 0 );


cornerEigenValsAndVecs()
作用:计算图像块的特征值和特征向量用于角点检测。
形式:void cornerEigenValsAndVecs(InputArray src, OutputArray dst, int blockSize, int ksize, int borderType=BORDER_DEFAULT );
参数:

src:输入单通道8位或浮点图像;

dst:用来存储结果的图像;它有src相同的大小和类型为CV_32FC(6);

blockSize:领域尺寸;
ksize:Sobel()算子的孔径参数;
borderType:像素外推方式;


cornerMinEigenVal()
作用:计算梯度矩阵的最小特征值用于角点检测。
形式:void cornerMinEigenVal(InputArray src, OutputArray dst, int blockSize, int ksize=3, int borderType=BORDER_DEFAULT );
参数:
src:输入单通道8位或浮点图像;
dst:用来存储最小特征值的图像;它有src相同的大小和类型为CV_32FC1;
blockSize:领域尺寸;
ksize:Sobel()算子的孔径参数;
borderType:像素外推方式;


goodFeaturesToTrack——Shi-Tomasi角点检测

goodFeaturesToTrack有比cornerHarris更多的控制参数,函数原型:


  1. void goodFeaturesToTrack( InputArray image, OutputArray corners,  
  2.                                      int maxCorners, double qualityLevel, double minDistance,  
  3.                                      InputArray mask=noArray(), int blockSize=3,  
  4.                                      bool useHarrisDetector=falsedouble k=0.04 ); 
第一个参数image:8位或32位单通道灰度图像;

第二个参数corners:位置点向量,保存的是检测到的角点的坐标;

第三个参数maxCorners:定义可以检测到的角点的数量的最大值;

第四个参数qualityLevel:检测到的角点的质量等级,角点特征值小于qualityLevel*最大特征值的点将被舍弃;

第五个参数minDistance:两个角点间最小间距,以像素为单位;

第六个参数mask:指定检测区域,若检测整幅图像,mask置为空Mat();

第七个参数blockSize:计算协方差矩阵时窗口大小;

第八个参数useHarrisDetector:是否使用Harris角点检测,为false,则使用Shi-Tomasi算子;

第九个参数k:留给Harris角点检测算子用的中间参数,一般取经验值0.04~0.06。第八个参数为false时,该参数不起作用;


cornerSubPix()亚像素角点检测

goodFeaturesToTrack()提取到的角点只能达到像素级别,在很多情况下并不能满足实际的需求,这时,我们则需要使用cornerSubPix()对检测到的角点作进一步的优化计算,可使角点的精度达到亚像素级别。

  1. void cv::cornerSubPix(  
  2.     cv::InputArray image, // 输入图像  
  3.     cv::InputOutputArray corners, // 角点(既作为输入也作为输出)  
  4.     cv::Size winSize, // 区域大小为 NXN; N=(winSize*2+1)  
  5.     cv::Size zeroZone, // 类似于winSize,但是总具有较小的范围,Size(-1,-1)表示忽略  
  6.     cv::TermCriteria criteria // 停止优化的标准  
  7. );  


原创粉丝点击