OpenCV:goodFeaturesToTrack角点检测的应用

2025-10-09 09:43:50

1、goodFeaturesToTrack格式:

void goodFeaturesToTrack(

                      InputArray image,  //输入图像 

                       OutputArray corners, //输出角点vector 

                       int maxCorners,  //最大角点数目 

                       double qualityLevel, // 质量水平系数                       

                       double minDistance, // 最小距离,小于此距离的点忽略 

                       InputArray mask = noArray(), // mask=0的点忽略 

                       int blockSize = 3, //邻域数 

                      bool useHarrisDetector = false, // false =Shi Tomasi metric 

                       double k = 0.04 //Harris角点检测时使用 

); 

参数:

第一个参数是输入图像(8位或32位单通道图);

第二个参数是检测的所有角点,类型为vector或数组,由给定的参数类型而定。如果是vector,那么它应该是一个包含cv::Point2f的vector对象;如果类型是cv::Mat,那么它的每一行对应一个角点,点的x、y位置分别是两列;

第三个参数用于限定检测到的点数的最大值;

第四个参数表示检测到的角点的质量水平(通常是0.10到0.01之间的数值,不能大于1.0);

第五个参数用于区分相邻两个角点的最小距离(小于这个距离得点将进行合并);

第六个参数是mask,如果指定,它的维度必须和输入图像一致,且在mask值为0处不进行角点检测。

第七个参数是blockSize,表示在计算角点时参与运算的区域大小,常用值为3,但是如果图像的分辨率较高则可以考虑使用较大一点的值;

第八个参数用于指定角点检测的方法,如果是true则使用Harris角点检测,false则使用Shi Tomasi算法;

第九个参数是在使用Harris算法时使用,最好使用默认值0.04;

OpenCV:goodFeaturesToTrack角点检测的应用

2、goodFeaturesToTrack应用

程序:

#include <opencv2\opencv.hpp>

#include <opencv2\highgui\highgui.hpp>

#include <opencv2\features2d\features2d.hpp>

#include <opencv2\core\core.hpp>

using namespace std; 

using namespace cv; 

int main()

{

       Mat image_color = imread("Lighthouse.jpg", 1);  

       Mat image_gray; 

       cvtColor(image_color, image_gray, COLOR_BGR2GRAY); 

      

       //设置角点检测参数 

       vector<Point2f> corners; 

       int max_corners = 500; 

       double quality_level = 0.01; 

       double min_distance = 3.0; 

       int block_size = 3; 

       bool use_harris = false; 

       double k = 0.04; 

       goodFeaturesToTrack(image_gray,  

                             corners,  

                             max_corners,  

                             quality_level,  

                             min_distance,  

                                      Mat(),  

                                      block_size,  

                                      use_harris,  

                                      k); 

       //将检测到的角点绘制到原图上 

       for (int i = 0; i < corners.size(); i++) 

       { 

              circle(image_color, corners[i], 1, Scalar(0, 0, 255), 2, 8, 0); 

       }

       namedWindow("house corner",CV_WINDOW_NORMAL);

       imshow("house corner", image_color); 

       waitKey(0); 

       return 0; 

}

OpenCV:goodFeaturesToTrack角点检测的应用

3、cornerSubPix()格式

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

使角点的精度达到亚像素级别。

void cornerSubPix( 

                InputArray image, // 输入图像 

                InputOutputArray corners, // 角点

                Size winSize, // 区域大小为 N*N; N=(winSize*2+1) 

                Size zeroZone, // 类似于winSize,Size(-1,-1)表示忽略 

                TermCriteria criteria // 停止优化的标准 

); 

第一个参数是输入图像和goodFeaturesToTrack()中的输入图像是同一个图像。

第二个参数是检测到的角点,即是输入也是输出。

第三个参数是计算亚像素角点时考虑的区域大小,大小为N*N; N=(winSize*2+1)。

第四个参数作用类似于winSize,但是总是具有较小的范围,通常忽略(即Size(-1, -1))。

第五个参数表示计算亚像素时停止迭代的标准,可选的值有TermCriteria::MAX_ITER 、TermCriteria::EPS,前者表示迭代次数达到了最大次数时停止,后者表示角点位置变化的最小值已经达到最小时停止迭代。二者均使用cv::TermCriteria()构造函数进行指定。

OpenCV:goodFeaturesToTrack角点检测的应用

4、goodFeaturesToTrack结合cornerSubPix的应用

程序:

#include <opencv2\opencv.hpp>

#include <opencv2\highgui\highgui.hpp>

#include <opencv2\features2d\features2d.hpp>

#include <opencv2\core\core.hpp>

using namespace std; 

using namespace cv; 

int main()

{

       Mat image_color = imread("Lighthouse.jpg", 1);  

       Mat image_gray; 

       cvtColor(image_color, image_gray, COLOR_BGR2GRAY); 

      

       //设置角点检测参数 

       vector<Point2f> corners; 

       int max_corners = 500; 

       double quality_level = 0.01; 

       double min_distance = 3.0; 

       int block_size = 3; 

       bool use_harris = false; 

       double k = 0.04; 

       goodFeaturesToTrack(image_gray,  

                              corners,  

                              max_corners,  

                              quality_level,  

                              min_distance,  

                                          Mat(),  

                                          block_size,  

                                          use_harris,  

                                          k); 

       //将检测到的角点绘制到原图上 

       for (int i = 0; i < corners.size(); i++) 

       { 

              circle(image_color, corners[i], 1, Scalar(0, 0, 255), 2, 8, 0); 

       }

       namedWindow("goodTrack corner",CV_WINDOW_NORMAL);

       imshow("goodTrack corner", image_color); 

 

       //指定亚像素计算迭代标注 

       TermCriteria criteria = TermCriteria(

                                      TermCriteria::MAX_ITER + TermCriteria::EPS, 

                                      40, 

                                      0.01); 

       //亚像素检测 

       cornerSubPix(image_gray, corners, Size(5, 5), Size(-1, -1), criteria); 

       //将检测到的亚像素角点绘制到原图上 

       for (int i = 0; i < corners.size(); i++) 

       { 

              circle(image_color, corners[i], 5, cv::Scalar(0, 255, 0), 2, 8, 0); 

       }

       namedWindow("sub pixel corner",CV_WINDOW_NORMAL);

       imshow("sub pixel corner", image_color); 

       waitKey(0); 

       return 0; 

OpenCV:goodFeaturesToTrack角点检测的应用

5、像素角点与亚像素角点对比:

如图所示:

OpenCV:goodFeaturesToTrack角点检测的应用

OpenCV:goodFeaturesToTrack角点检测的应用

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢