OpenCv-C++-Shi-Tomasi角點檢測
阿新 • • 發佈:2018-11-30
這次的tomasi跟上次的harris比,兩者原理上很像,可以說tomasi是harris的進化版。個人覺得,如果做角點檢測的話,首選tomasi,因為它優化很好,響應速度比harris快。拖動TrackBar時,真的快如風,但使用harris時,有時還會崩掉。
tomasi基本原理如下:
相關API使用及說明:
上面截圖來自於賈志剛老師的ppt頁面,在此感謝賈志剛老師!
下面附上原始碼:
#include<opencv2/opencv.hpp> #include<iostream> #include<math.h> using namespace cv; using namespace std; int current_corner = 5; int max_corner = 200; const char* output_title = "tomasi demo"; void tomasi(int, void*); Mat src,gray_src; int main(int argc, char** argv) { src = imread("D:/test/大廈.jpg"); if (!src.data) { cout <<"圖片未找到"<<endl; return -1; } imshow("input title", src); namedWindow(output_title, CV_WINDOW_AUTOSIZE); createTrackbar("corner_num", output_title, ¤t_corner, max_corner, tomasi); tomasi(0, 0); waitKey(0); return 0; } void tomasi(int, void *) { RNG rng(12345); cvtColor(src, gray_src, CV_BGR2GRAY); if (current_corner < 5) { current_corner = 5; } Mat resultImg = gray_src.clone(); cvtColor(resultImg, resultImg, COLOR_GRAY2RGB);//如果不轉,生成的corner也是灰色的 vector<Point2f> corners; double qualityLevel = 0.01; double minDistance=10;//兩個角點之間的最小距離 int blocksize = 3; bool useHarrDetector = false; double k = 0.04; goodFeaturesToTrack(gray_src, corners, current_corner, qualityLevel, minDistance, Mat(), blocksize, useHarrDetector, k); cout << "Num of Corner:" << corners.size() << endl; for (size_t i = 0; i < corners.size(); i++) { Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)); circle(resultImg, corners[i], 2, color, 2, 8, 0); } imshow(output_title, resultImg); }
---------------------------------------------------------程式執行結果-----------------------------------------
輸入圖片:
角點檢測圖(當前值:95):
角點檢測圖(當前值:181):