2012-05-31 28 views
3

我使用opencv2.3.1來檢測圖像中的關鍵點SIFT。但是我發現在檢測結果中有重複點。即有兩個具有相同座標(以像素爲單位)的關鍵點,但是它們的對應描述符是非常不同的。以下代碼顯示了SIFT提取過程。我認爲人們應該熟悉使用的「box.png」。所以任何有興趣的人都可以嘗試下面的代碼,看看你是否和我有同樣的問題。重複篩選關鍵點在單個圖像

#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/features2d/features2d.hpp" 
#include <iostream> 
int main() 
{ 
cv::Ptr<cv::FeatureDetector> detector = cv::FeatureDetector::create("SIFT"); 
cv::Ptr<cv::DescriptorExtractor> extractor = cv::DescriptorExtractor::create("SIFT"); 
cv::Mat im = cv::imread("box.png", CV_LOAD_IMAGE_COLOR); 
std::vector<cv::KeyPoint> keypoints; 
cv::Mat descriptors; 
detector->detect(im, keypoints); 
extractor->compute(im,keypoints,descriptors); 
int duplicateNum = 0; 
for (int i=0;i<keypoints.size();i++) 
{ 
    for (int j=i+1;j<keypoints.size();j++) 
    { 
     float dist = abs((keypoints[i].pt.x-keypoints[j].pt.x))+abs((keypoints[i].pt.y-keypoints[j].pt.y)); 
     if (dist == 0) 
     { 
      cv::Mat descriptorDiff = descriptors.row(i)-descriptors.row(j); 
      double diffNorm = cv::norm(descriptorDiff); 
      std::cout<<"keypoint "<<i<<" equal to keypoint "<<j<<" descriptor distance "<<diffNorm<<std::endl; 
      duplicateNum++; 
     } 
    } 
} 
std::cout<<"Total keypoint: "<<keypoints.size()<<", duplicateNum: "<<duplicateNum<<std::endl; 

return 1; 

}

回答

1

是的,這是真的 - OpenCV的執行SIFT描述產生多個描述一些關鍵點,他們在定位不同(SIFT關鍵點的描述符估計主方向)

4

希望能幫到你明白爲什麼。

的大小和方向來計算周圍的關鍵點的所有像素。然後,爲此創建一個直方圖。 在這個直方圖中,360度的方位被分成36個分檔(每個分10度)。可以說,在某個點(在「定向收集區域」)的梯度方向是18.759度,然後它將進入10-19度的區間。並且添加到容器中的「量」與該點處的梯度大小成比例。 對關鍵點周圍的所有像素完成此操作後,直方圖將在某個點處具有峯值。

假設,你看直方圖峯值在20-29度。所以,關鍵點被分配方向3(第三倉)

此外,最高峯的80%以上的任何峯值被轉換成一個新的關鍵點。這個新的關鍵點具有與原始位置相同的位置和比例。但它的方向等於另一個高峯。

因此,定向能分裂一個關鍵點到多個關鍵點。

約SIFT

大參考:

相同的關鍵點,但不同的描述符如圖以下:

enter image description here

enter image description herehttp://aishack.in/tutorials/sift-scale-invariant-feature-transform-introduction/

+0

是的,這是真實的;但沒有錯?或者讓我們說這是否會導致在順序圖像/幀中找到匹配的問題? –

+0

@farzin這是對的。爲了提高SIFT點的穩健性,作者補充說。 – vancexu

+0

當重複指向同一地點時,爲什麼它應該算作健壯性? –

1

我通過使用.NET實施SIFT面臨同樣的問題

+0

背後的理由是什麼? –

+0

@ vancexu:正如你所說的,「有更多的機會獲得正確的匹配,而不會因旋轉而丟失關鍵點」。這很好,但是在幀之間進行匹配可能會導致誤導。在一些匹配算法中,例如我們需要至少5個點。如果我們有(可以說)2個重複點會發生什麼?我擔心這對於這樣的匹配算法可能是有利的 –