#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;
#define WINDOW_NAME "【亚像素级角点检测】"
Mat g_srcImage, g_grayImage;
int g_maxCornerNumber = 33;
int g_maxTrackbarNumber = 500;
RNG g_rng(12345);
void on_GoodFeaturesToTrack(int, void *) {
if (g_maxCornerNumber <= 1) {
g_maxCornerNumber = 1;
}
vector<Point2f> corners;
double qualityLevel = 0.01;
double minDistance = 10;
int blockSize = 3;
double k = 0.04;
Mat copy = g_srcImage.clone();
goodFeaturesToTrack(g_grayImage,
corners,
g_maxCornerNumber,
qualityLevel,
minDistance,
Mat(),
blockSize,
false,
k);
cout << "\n\t>-------------此次检测到的角点数量为:" << corners.size() << endl;
int r = 4;
for (unsigned int i = 0; i < corners.size(); i++) {
circle(copy, corners[ i ], r,
Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)), -1, 8,
0);
}
imshow(WINDOW_NAME, copy);
Size winSize = Size(5, 5);
Size zeroZone = Size(-1, -1);
TermCriteria criteria = TermCriteria(TermCriteria::EPS + TermCriteria::MAX_ITER, 40, 0.001);
cornerSubPix(g_grayImage, corners, winSize, zeroZone, criteria);
for (int i = 0; i < corners.size(); i++) {
cout << " \t>>精确角点坐标[" << i << "] (" << corners[ i ].x << "," << corners[ i ].y
<< ")" << endl;
}
}
static void ShowHelpText() {
printf("\n\n\t\t\t非常感谢购买《OpenCV3编程入门》一书!\n");
printf("\n\n\t\t\t此为本书OpenCV2版的第88个配套示例程序\n");
printf("\n\n\t\t\t 当前使用的OpenCV版本为:" CV_VERSION);
printf("\n\n ----------------------------------------------------------------------------\n");
printf("\n\t欢迎来到【亚像素级角点检测】示例程序\n\n");
printf("\n\t请调整滑动条观察图像效果\n\n");
}
int main() {
ShowHelpText();
g_srcImage = imread("1.jpg", 1);
cvtColor(g_srcImage, g_grayImage, COLOR_BGR2GRAY);
namedWindow(WINDOW_NAME, WINDOW_AUTOSIZE);
createTrackbar("最大角点数", WINDOW_NAME, &g_maxCornerNumber, g_maxTrackbarNumber,
on_GoodFeaturesToTrack);
imshow(WINDOW_NAME, g_srcImage);
on_GoodFeaturesToTrack(0, 0);
waitKey(0);
return (0);
}