SIFT特徵

在不同影像上進行特徵匹配時,常會遇到尺度變化的問題,也就是要分析的物體,可能在不同張影像的大小是不同的,當我們實際上要進行匹配時,由於尺度的差異,同個物體的特徵並不會匹配。

為了解決這個問題,有些算法用來尋找尺度不變的特徵,主要是基於每個檢測到的特徵點都伴隨著對應的尺寸,這邊介紹一種尺度不變的特徵,SIFT(Scale-Invariant Feature Transform)特徵,和另一個著名的尺度不變特徵檢測器SURF(Speeded Up Robust Features)相比,SURF速度較快,SIFT搜尋的特徵較準確。


以下使用程式碼使用SiftFeatureDetector找到影像的SURF特徵,接著用drawKeyPoints()劃出特徵點,旗標使用DRAW_RICH_KEYPOINTS,可看出圓圈的尺寸與特徵的尺度成正比,同時由於SURF算法將方向與每個特徵作關聯,使得特徵具有旋轉無關性:


影像匹配除了需要檢測圖像的特徵點,還需要向量來描述特徵才能進行比較,OpenCV裡使用SiftDescriptorExtractor來得到特徵點的SIFT描述子,描述子是一個Mat,行數與特徵點個數相同,每行都是一個N維的特徵向量,SIFT的描述子維度為128,特徵向量描述特徵點周圍的強度樣式,兩個特徵點越類似,特徵向量的距離越近。

假使我們想匹配在不同圖像的兩個相同物體,首先取得每個圖像的特徵,然後提取他們的描述子,將第一幅圖像和第二幅圖像中的每個特徵向量做比較,距離最近的特徵向量即為那個特徵的最佳匹配,對第一幅圖像的所有特徵都進行此處理,這也是BruteForceMatcher所採用的方法。

以下範例使用SIFT演算法檢測特徵點,並呼叫drawMatches()看特徵點的匹配情形:

  • Anyao Cheng

    請問為什麼看不到使用SIFT演算法檢測特徵點,並呼叫drawMatches()看特徵點的匹配情形的範例?