1.Shi-Tomas角点检测原理
Shi-Tomasi(也称为Good Features to Track)角点检测算法是一种改进的角点检测方法,它基于Harris角点检测算法,并针对一些不足进行了改进。
与Harris角点检测不同,Shi-Tomasi使用了更简化的角点响应函数。它选择了自相关矩阵M的较小特征值λmin作为评价角点的依据:
角点响应函数即为较小特征值。
角点判断如图所示:
- 当λ1和λ2都小于λmin时,为平面区域
- 当λ1和λ2都大于λmin时,为角点
- 当λ1和λ2只有一个大于λmin时,为边缘区域
2.检测Shi-Tomas角点函数goodFeaturesToTrack()
void cv::goodFeaturesToTrack ( InputArray image,
OutputArray corners,
int maxCorners,
double qualityLevel,
double minDistance,
InputArray mask = noArray(),
int blockSize = 3,
bool useHarrisDetector =false,
double k = 0.04
)
- corners:检测到角点的输出量
- maxCorners:要寻找的角点数目。
- qualityLevel: 角点阙值与最佳角点的关系,又称质量等级,当参数为0.01,表示角点阙值是最佳角点的0.01倍
- minDistance:两个角点之间的最小欧式距离
- mask:掩码矩阵,表示检测角点的区域。
- blockSize:计算梯度协方差矩阵的尺寸。
- useHarrisDetector:是否使用Harris角点
- k:Haris检测角点过程中的常值权重系数
3.示例代码
void Tomas_f(Mat mat){ Mat gray; cvtColor(mat,gray,COLOR_BGR2GRAY); //提取角点 int maxCorners=100;//检测角点数目 double quality_level=0.01;//质量等级 double minDistance=0.04;//两个角点之间的最小欧式距离 vector<Point2f> corners; goodFeaturesToTrack(gray,corners,maxCorners,quality_level,minDistance,Mat(),3, false); //绘制角点 vector<KeyPoint> keyPoints;//存放角点的KeyPoint类,用于后期绘制角点时使用 for(int i=0;i<corners.size();i++){ //将角点存放在KeyPoint类中 KeyPoint keyPoint; keyPoint.pt=corners[i]; keyPoints.push_back(keyPoint); } //用drwaKeyPoints()函数绘制角点坐标 drawKeypoints(mat,keyPoints,mat); imwrite("/sdcard/DCIM/mat.png",mat); }