和調用Shi Tomasi檢測相同,只不過在檢測出角點以後對其進行cornerSubPix處理,cornerSubPix函數中有一個迭代類,TermCriteria還比較陌生。還有zeroZone參數,一般默認是Size(-1,-1)。
運行截圖:
官方給的例子如下:
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;
Mat src, src_gray;
int maxCorners = 10;
int maxTrackbar = 500;
RNG rng(12345);
const char* source_window = "Image";
void goodFeaturesToTrack_Demo(int, void*);
int main(int, char** argv)
{
src = imread("test.jpg", IMREAD_COLOR);
cvtColor(src, src_gray, COLOR_BGR2GRAY);
namedWindow(source_window, WINDOW_AUTOSIZE);
createTrackbar("Max corners:", source_window, &maxCorners, maxTrackbar, goodFeaturesToTrack_Demo);
imshow(source_window, src);
goodFeaturesToTrack_Demo(0, 0);
waitKey(0);
return(0);
}
void goodFeaturesToTrack_Demo(int, void*)
{
if (maxCorners < 1) { maxCorners = 1; }
vector<Point2f> corners;
double qualityLevel = 0.01;
double minDistance = 10;
int blockSize = 3;
bool useHarrisDetector = false;
double k = 0.04;
Mat copy;
copy = src.clone();
goodFeaturesToTrack(src_gray,
corners,
maxCorners,
qualityLevel,
minDistance,
Mat(),
blockSize,
useHarrisDetector,
k);
cout << "** Number of corners detected: " << corners.size() << endl;
Size winSize = Size(5, 5);
Size zeroZone = Size(-1, -1);
TermCriteria criteria = TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 40, 0.001);
cornerSubPix(src_gray, corners, winSize, zeroZone, criteria);
for (size_t i = 0; i < corners.size(); i++)
{
circle(copy, corners[i], 4, Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)), -1, 8, 0);
}
namedWindow(source_window, WINDOW_AUTOSIZE);
imshow(source_window, copy);
for (size_t i = 0; i < corners.size(); i++)
{
cout << " -- Refined Corner [" << i << "] (" << corners[i].x << "," << corners[i].y << ")" << endl;
}
}