OpenCV圖像特征提取之Shi-Tomasi角點檢測算法詳解
一.Shi-Tomasi 角點檢測算法
Harris角點檢測基本數(shù)學公式如下:
泰勒公式進行展開后,近似為:
對于局部微小的移動量[u,v],可以近似得到下面的表達:
其中M為2*2的矩陣,可由圖像的導數(shù)求得:
矩陣M,將其對角化之后 ,特征值λ1, λ2 分別代表了X 和Y 方向的灰度變化率.
E(u,v)的橢圓形式如下:
Harris角點檢測算法的角點響應函數(shù)為:
Harris角點檢測算法就是對角點響應函數(shù)R進行閾值處理:R > threshold,即提取R的局部極大值。shi-Tomasi 算法是基于Harris 算法進行的改進,Harris算法最基礎的數(shù)學定義是將矩陣 M 的行列式值與矩陣 M 的跡相減,再將差值與預先給定的閾值進行比較。若兩個特征值中較小的一個大于最小閾值,則會得到強角點,這就是Shi-Tomasi角點檢測算法。
Shi-Tomasi角點檢測算法的角點響應函數(shù)為:
Shi-tomasi角點檢測 和Harris 算法一樣,如果該分數(shù)大于設定的閾值,我們就認為它是一個角點??梢钥闯鰜碇挥挟?λ1 和 λ 2 都大于最小值時,才被認為是角點,即下圖中的紫色區(qū)域。
二.Shi-Tomasi角點檢測API函數(shù)接口
void goodFeaturesToTrack ( InputArray image, OutputArray corners, int maxCorners, double qualityLevel, double minDistance, InputArray mask=noArray(), int blockSize=3, bool useHarrisDetector=false, double k=0.04 );
參數(shù)說明:
第一個參數(shù)image:輸入圖像,8位或浮點32比特,單通道圖像;
第二個參數(shù)corners:輸出參數(shù),檢測到的角點;表示返回角點的數(shù)目,如果檢測出來角點數(shù)目大于最大數(shù)目則返回響應值最強前規(guī)定數(shù)目;
第三個參數(shù)corner_count:輸出參數(shù),檢測到的角點數(shù)目;
第四個參數(shù)quality_level:最大最小特征值的乘法因子。定義可接受圖像角點的最小質量因子;
第五個參數(shù)min_distance:限制因子。得到的角點的最小距離;使用 Euclidian 距離;
第六個參數(shù)mask:ROI感興趣區(qū)域。函數(shù)在ROI中計算角點;如果 mask 為 NULL,則選擇整個圖像;
第七個參數(shù)block_size: 是計算導數(shù)的自相關矩陣時指定點的領域,采用小窗口計算的結果比單點 (也就是block_size為1)計算的結果要好;
第八個參數(shù)useHarrisDetector:當use_harris的值為非0,則函數(shù)使用Harris的角點定義;若為 0,則使用Shi-Tomasi的定義;
第九個參數(shù)K:用于設置Hessian自相關矩陣即對Hessian行列式的相對權重的權重系數(shù);
代碼實現(xiàn)
#include"stdafx.h" #include <opencv2/opencv.hpp> #include <iostream> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> using namespace cv; using namespace std; #define WIN_NAME "Shi-Tomasi角點檢測" Mat srcImage, grayImage; int maxCornerNumber = 33; int maxTrackbarNumber = 500; RNG rng(12345); void on_GoodFeatureToTrack(int, void *) { if (maxCornerNumber <= 1) { maxCornerNumber = 1; } //Shi-Tomasi參數(shù)準備 vector<Point2f> corners; double qualityLevel = 0.01; //角點檢測可以接受的最小特征值 double minDistance = 10; //角點間的最小像素距離設置 int blockSize = 3; //計算導數(shù)自相關矩陣時指定的領域范圍 double k = 0.04; //權重系數(shù) Mat copy = srcImage.clone(); //復制原圖到一個臨時變量中,作為感興趣區(qū)域 //Shi-Tomasi Test goodFeaturesToTrack(grayImage, corners, maxCornerNumber, qualityLevel, minDistance, Mat(), blockSize, false, k); //輸出文字信息 cout << ">此次檢測到的角點數(shù)量為: " << corners.size() << endl; //繪制檢測到的角點 for (unsigned int i = 0; i < corners.size(); i++) { circle(copy, corners[i], 5, Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)), -1, 8, 0); } imshow(WIN_NAME, copy); } int main(int argc, char** argv) { srcImage = imread("F:/photo/lj.jpg"); cvtColor(srcImage, grayImage, COLOR_BGR2GRAY); namedWindow(WIN_NAME, WINDOW_AUTOSIZE); createTrackbar("最大角點數(shù):", WIN_NAME, &maxCornerNumber, maxTrackbarNumber, on_GoodFeatureToTrack); //imshow(WIN_NAME, srcImage); on_GoodFeatureToTrack(0, 0); waitKey(0); return 0; }
圖像處理效果
到此這篇關于OpenCV圖像特征提取之Shi-Tomasi角點檢測算法詳解的文章就介紹到這了,更多相關OpenCV角點檢測算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
教你使用Matlab制作圖形驗證碼生成器(app designer)
這篇文章主要和大家分享如何利用Matlab制作一款圖形驗證碼生成器,文中的實現(xiàn)步驟講解詳細,感興趣的小伙伴可以跟隨小編動手試一試2022-02-02基于C語言構建一個獨立棧協(xié)程和共享棧協(xié)程的任務調度系統(tǒng)
這篇文章主要為大家詳細介紹了如何基于C語言構建一個獨立棧協(xié)程和共享棧協(xié)程的任務調度系統(tǒng),文中的示例代碼講解詳細,需要的可以參考下2024-02-02C語言 數(shù)據(jù)結構之鏈表實現(xiàn)代碼
這篇文章主要介紹了C語言 數(shù)據(jù)結構之鏈表實現(xiàn)代碼的相關資料,需要的朋友可以參考下2016-10-10