Harris角点检测方法
void cornerHarris( InputArray src, OutputArray dst, int blockSize, int ksize, double k, int borderType = BORDER_DEFAULT );

shi-Tomasi角度检测
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 );

#include "opencv2/opencv.hpp"
#include <vector>
using namespace cv;
using namespace std;
int val=130;
int max_val=255;
Mat src,dst,gray;
void Harris_Dome(int,void*)
{
Mat dst=Mat::zeros(src.size(),CV_32FC1);
Mat result,normScale;
int blocksize=2;
int ksize=3;
double k=0.04;
cornerHarris(gray,dst,blocksize,ksize,k,BORDER_DEFAULT);
normalize(dst,result,0,255,NORM_MINMAX);
convertScaleAbs(result,normScale);
Mat resIamg=src.clone();
for(int row=0;row<resIamg.rows;row++)
{
uchar* currentRow=normScale.ptr(row);
for(int col=0;col<resIamg.cols;col++)
{
int value=(int)*currentRow;
if(value > val){
circle(resIamg,Point(col,row),2,Scalar(0255,0),2,8,0);
}
currentRow++;
}
}
imshow("Harris角点检测",resIamg);
vector<Point2f> corners;
double qualitylevel=0.01;
double minDistance=10;
int blockSize1=3;
bool useHarris=false;
double k1=0.04;
Mat res=src.clone();
goodFeaturesToTrack(gray,corners,val,qualitylevel,minDistance,Mat(0,blockSize1,useHarris,k1));
printf("Number of detected corners:%d\n",corners.size());
for(int i=0;i<corners.size();i++)
{
circle(res,corners[i],2,Scalar(0,0,255),2,8,0);
}
imshow("shi_Tomasi角点检测",res);
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
src=imread("./image/1.jpg");
if(src.empty())
{
printf("could not load image....\n");
return -1;
}
imshow("input",src);
cvtColor(src,gray,CV_BGR2GRAY);
namedWindow("output",CV_WINDOW_AUTOSIZE);
createTrackbar("corner_harris","output",&val,max_val,Harris_Dome);
Harris_Dome(0,0);
return a.exec();
}
