萌新學習手冊:亞畫素級別角點檢測
阿新 • • 發佈:2018-12-12
在現實應用中我們的角點往往並不是整數,所以為了提高我們尋找角點的精確程度,我們需要進行處理,一般有三種方法
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); } }