J.Shi和C.Tomasi在1994年在其論文“Good Features to Track”中,提出了一種對Harris角點檢測算子的改進算法——Shi-Tomasi角點檢測算子,可以看到,Opencv中函數goodFeaturesToTrack就是直接取自他們論文的名字。
goodFeaturesToTrack有比cornerHarris更多的控制參數,函數原型:
void goodFeaturesToTrack( InputArray image, OutputArray corners,
int maxCorners, double qualityLevel, double minDistance,
InputArray mask=noArray(), int blockSize=3,
bool useHarrisDetector=false, double 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時,該參數不起作用;
goodFeaturesToTrack檢測Shi-Tomasi角點簡單demo:
#include "core/core.hpp"
#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"
using namespace cv;
Mat image;
Mat imageGray;
int thresh=5; //角點個數控制
int MaxThresh=255;
void Trackbar(int,void*);
int main(int argc,char*argv[])
{
image=imread(argv[1]);
cvtColor(image,imageGray,CV_RGB2GRAY);
GaussianBlur(imageGray,imageGray,Size(5,5),1); // 濾波
namedWindow("Corner Detected");
createTrackbar("threshold:","Corner Detected",&thresh,MaxThresh,Trackbar);
imshow("Corner Detected",image);
Trackbar(0,0);
waitKey();
return 0;
}
void Trackbar(int,void*)
{
Mat dst,imageSource;
dst=Mat::zeros(image.size(),CV_32FC1);
imageSource=image.clone();
vector<Point2f> corners;
goodFeaturesToTrack(imageGray,corners,thresh,0.01,10,Mat());
for(int i=0;i<corners.size();i++)
{
circle(imageSource,corners[i],2,Scalar(0,0,255),2);
}
imshow("Corner Detected",imageSource);
}
goodFeaturesToTrack相比cornerHarris,增加了檢測的複雜度,同時也可以更好的控制檢測到的角點的特性,比如角點個數,角點間最小間距等。設定檢測點數為11時,隻有特征值最大的前11個角點被檢測出來:
繼續增大檢測點數的值,所有角點都被檢測出來: