goodFeaturesToTrack——Shi-Tomasi角點檢測
阿新 • • 發佈:2019-02-04
J.Shi和C.Tomasi在1994年在其論文“Good Features to Track”中,提出了一種對Harris角點檢測運算元的改進演算法——Shi-Tomasi角點檢測運算元,可以看到,Opencv中函式goodFeaturesToTrack就是直接取自他們論文的名字。
goodFeaturesToTrack有比cornerHarris更多的控制引數,函式原型:
第一個引數image:8位或32位單通道灰度影象;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 );
第二個引數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個角點被檢測出來:
繼續增大檢測點數的值,所有角點都被檢測出來: