它是Harris的改进版,最原始的定义是将矩阵M的行列式与M的迹相减,再将差值同预先给定的阈值进行比较。改进后,若两个特征值中较小的一个大于最小阈值,则会得到强角点。
void cv::goodFeaturesToTrack | ( | InputArray | image, |
OutputArray | corners, //检测到的角点的输出向量 | ||
int | maxCorners, //角点的最大数量 | ||
double | qualityLevel, //角点检测可接受的最小特征值,实际用于过滤角点的最小特征值是qualitylevel与图像中最大特征值的乘积。取值通常不会超过1(常用值为0.1或0.01) | ||
double | minDistance, //角点之间的最小距离 | ||
InputArray | mask = noArray() , //感兴趣区域,非空用于指定角点检测区域 | ||
int | blockSize = 3 , //计算导数自相关矩阵时指定的邻域范围 | ||
bool | useHarrisDetector = false , //是否使用Harris角点检测 | ||
double | k = 0.04 //用于设置Hessian自相关矩阵行列式的相对权重系数 | ||
) |
案例:
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include<iostream>
using namespace cv;
using namespace std;
int maxCorners = 30; // 角点的最大数量
double qualityLevel = 0.1; //角点检测可接受的最小特征值
double minDistance = 2; // 角点之间的最小距离
int main()
{
// 读入图像
Mat src, grayimg;
src = imread("C:\\Users\\H\\Desktop\\15.png");
if (src.empty())
{
cout << "请检查图像是否存在..." << endl;
return -1;
}
//转换成灰度图
cvtColor(src, grayimg, COLOR_BGR2GRAY);
namedWindow("grayimg");
imshow("grayimg", grayimg);
// Shi-Tomasi角点检测
//创建一个存储二维点的容器corners
vector<Point2f> corners;
goodFeaturesToTrack(grayimg, corners, maxCorners, qualityLevel, minDistance);
// 绘制角点
for (size_t i = 0; i < corners.size(); i++)
{
circle(src, corners[i], 2.5, Scalar(0, 255, 0),-1,8);
}
// 获取其中三个点的坐标信息并绘制在图形上
cout << "corners0: " << corners[0] << endl;
cout << "corners1: " << corners[1] << endl;
cout << "corners2: " << corners[2] << endl;
circle(src, corners[0], 4, Scalar(0, 0, 255),4,8);
circle(src, corners[1], 4, Scalar(0, 255, 0),4,8);
circle(src, corners[2], 4, Scalar(255, 0, 0),4,8);
namedWindow("Shi-Tomasi corner");
imshow("Shi-Tomasi corner", src);
waitKey();
return 0;
}
结果展示: