OpenCv-C++-SIFT特徵檢測
阿新 • • 發佈:2018-11-30
引用及參考部落格:https://blog.csdn.net/lyl771857509/article/details/79675137
1、SIFT綜述
尺度不變特徵轉換(Scale-invariant feature transform或SIFT)是一種電腦視覺的演算法用來偵測與描述影像中的區域性性特徵,它在空間尺度中尋找極值點,並提取出其位置、尺度、旋轉不變數,此演算法由 David Lowe在1999年所發表,2004年完善總結。
其應用範圍包含物體辨識、機器人地圖感知與導航、影像縫合、3D模型建立、手勢辨識、影像追蹤和動作比對。
此演算法有其專利,專利擁有者為英屬哥倫比亞大學。
區域性影像特徵的描述與偵測可以幫助辨識物體,SIFT 特徵是基於物體上的一些區域性外觀的興趣點而與影像的大小和旋轉無關。對於光線、噪聲、些微視角改變的容忍度也相當高。基於這些特性,它們是高度顯著而且相對容易擷取,在母數龐大的特徵資料庫中,很容易辨識物體而且鮮有誤認。使用 SIFT特徵描述對於部分物體遮蔽的偵測率也相當高,甚至只需要3個以上的SIFT物體特徵就足以計算出位置與方位。在現今的電腦硬體速度下和小型的特徵資料庫條件下,辨識速度可接近即時運算。SIFT特徵的資訊量大,適合在海量資料庫中快速準確匹配。
#include<opencv2/opencv.hpp> #include<iostream> #include<math.h> #include<opencv2/xfeatures2d.hpp> using namespace cv; using namespace std; using namespace cv::xfeatures2d; Mat src; int main(int argc, char** argv) { src = imread("D:/test/src.png",IMREAD_GRAYSCALE); if (!src.data) { cout << "圖片未找到" << endl; return -1; } imshow("input title", src); int numfeature = 400; Ptr<SIFT>detector = SIFT::create(numfeature);//與SURF一樣,剩餘的取預設值 vector<KeyPoint>keypoints; detector->detect(src, keypoints, Mat()); Mat resultImg; drawKeypoints(src, keypoints, resultImg, Scalar::all(-1), DrawMatchesFlags::DEFAULT); imshow("SIFT keypoint", resultImg); waitKey(0); return 0; }
執行結果:
總的來說,SIFT執行效率比SURF低一些,但是檢測準確率卻比SURF高。