1. 程式人生 > >goodFeaturesToTrack——Shi-Tomasi角點檢測

goodFeaturesToTrack——Shi-Tomasi角點檢測

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個角點被檢測出來:




繼續增大檢測點數的值,所有角點都被檢測出來: