1. 程式人生 > >萌新學習手冊:亞畫素級別角點檢測

萌新學習手冊:亞畫素級別角點檢測

在現實應用中我們的角點往往並不是整數,所以為了提高我們尋找角點的精確程度,我們需要進行處理,一般有三種方法

1.插值方法

2.基於影象矩計算

3.圖線擬合(高斯曲面,多項式,橢圓曲面)其中高斯曲面最為常用

具體的使用過程就是我們先用Shi-Tomasi角點檢測 把角點找出來,然後再進行精確

 cornerSubPix(InputArray image, 
              InputOutputArray corners, 
              Size winSize, Size zeroZone, 
              TermCriteria criteria)

這裡介紹一下TermCriteria用於迭代演算法的終止條件,該類變數需要3個引數,一個是型別,第二個引數為迭代的最大次數,最後一個是特定的閾值。型別有CV_TERMCRIT_ITER、CV_TERMCRIT_EPS、CV_TERMCRIT_ITER+CV_TERMCRIT_EPS,分別代表著迭代終止條件為達到最大迭代次數終止,迭代到閾值終止,或者兩者都作為迭代終止條件。以上的巨集對應的c++的版本分別為TermCriteria::COUNT、TermCriteria::EPS,這裡的COUNT也可以寫成MAX_ITER。

#include<iostream>
#include<opencv2/opencv.hpp>
#define Rc Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255))
using namespace std;
using namespace cv;
const char* output_tile = "SubPixcel Result";
Mat src, gray_src;
RNG rng(12345);
int max_corners = 15;
int max_count = 500;
void subPixel_Demo(int, void*);
int main(int argc, char** argv) {
	src = imread("C:/Users/pbiha/Desktop/image/b1.jpg");
	if (src.empty()) {
		puts("Can't find the img...");
		return -1;
	}
	cvtColor(src, gray_src, COLOR_BGR2GRAY);
	namedWindow("input", CV_WINDOW_AUTOSIZE);
	imshow("input", src);
	namedWindow(output_tile, CV_WINDOW_AUTOSIZE);

	createTrackbar("Corners:", output_tile, &max_corners, max_count, subPixel_Demo);
	subPixel_Demo(0, 0);
	waitKey(0);
	return 0;
}

void subPixel_Demo(int, void*) {
	if (max_corners < 5)max_corners = 5;
	vector<Point2f>corners;
	double minDistance = 0;
	double qualityLevel=0.001;
	Mat resultImg = src.clone();
	goodFeaturesToTrack(gray_src, corners, max_corners, qualityLevel, minDistance,Mat(),3,false,0.4);
	for (size_t t=0; t < corners.size(); t++) {
		circle(resultImg, corners[t], 2, Rc, 2);
	}
	imshow(output_tile, resultImg);

	TermCriteria tc = TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 40, 0.001);
	cornerSubPix(gray_src, corners, Size(5, 5), Size(-1, -1), tc);
	for (size_t t = 0; t < corners.size(); t++) {
		printf("%f %f\n", corners[t].x, corners[t].y);
	}
}