2014-12-04 64 views
0

我試圖用openCV實現SIFT,並且我參考了這些鏈接link1link2。此外,我還閱讀了Lowe寫的關於SIFT的論文。我對鏈接1和鏈接2中的代碼有一些問題。使用openCV在圖像中實現SIFT

  1. cv :: SiftFeatureDetector detector(0.05,5.0); cv :: SiftDescriptorExtractor提取器(3.0);

    我無法完全理解上述函數中的參數。如果我將第一個函數修改爲cv :: SiftFeatureDetector檢測器(0.05,10.0); ,有一個運行時間OpenCV錯誤:斷言失敗< firstOctave> = - 1 %% actualNLayers < = nOctaveLayers>。

    此外,我沒有意識到SiftDescriptorExtractor提取器()中的參數。我知道在關鍵點匹配中存在距離比率,但範圍是[0,1]。

  2. 我想修改我用來匹配圖片的方法,所以我需要提取描述符和每個關鍵點的主導方向。如何提取每個關鍵點的描述符和主導方向?

非常感謝您的回覆。

回答

3

我的建議是,你應該在開始時使用SIFT的默認參數。然後,如果您對結果不滿意,可嘗試優化這些參數。

Ptr<FeatureDetector> detector = new SIFT();; 
Ptr<DescriptorExtractor> extractor = new SIFT(); 

U可以找到有關OpenCV的執行這裏SIFT參數有用的信息:http://docs.opencv.org/modules/nonfree/doc/feature_detection.html

要計算關鍵點:

vector<KeyPoint> keypoints; 
detector->detect(yourImage, keypoints); 

當你計算關鍵點的方位自動計算並與每個關鍵點的參數「角度」相關聯。請在這裏找到更多的信息:http://docs.opencv.org/modules/features2d/doc/common_interfaces_of_feature_detectors.html

要計算關鍵點的描述:

Mat descriptors; 
extractor->compute(yourImage, keypoints, descriptors); 

作爲墊描述一個描述符的每一行。

如果您有任何問題,請讓我知道! 希望這有助於。

+0

我尋覓其他物品和實施SIFT通過OpenCV的。我使用cv :: SIFT siftDetectorExtractor = cv :: SIFT(0,3,0.04,10,1.6);和siftDetectorExtractor(tmp,cv :: Mat(),keypoints1,sifts1);.但是,當我想知道關鍵點的協調時,我使用keypoints1 [0] .pt並且結果不是整數。爲什麼?圖像是數字的,所以關鍵點的協調需要是整數。 – Kuo 2014-12-05 15:21:32

+0

此外,我已經通過sifts1.at (0,0)訪問sifts1.at (0,127)描述符的第一個關鍵點。我是否需要將sifts1.at (0,0)的順序在匹配前旋轉到sifts1.at (0,127)和其他關鍵點的描述符?或者它的順序是從主導方向開始,並自動結束在主導方向?所以我可以直接使用結果進行匹配。 – Kuo 2014-12-05 15:25:19

+0

此外,我仍然無法找到cv :: SiftDescriptorExtractor提取器()中參數的含義;你在我的學習中幫助我很多。非常感謝您的回覆。 – Kuo 2014-12-05 15:27:41

1
  • cv :: SiftFeatureDetector檢測器(0.05,5.0),第一個參數是對比度閾值。這是接受關鍵點的最小對比度。第二個參數是邊緣拒絕閾值。如果你想獲得更多的功能,你應該增加第一個參數和/或減少第二個參數。
  • cv :: SiftDescriptorExtractor提取器(3.0),參數是magnificaiton值,描述符的大小是通過關鍵點乘以該值來確定的。使用前綴參數是可以的。

欲瞭解更多信息:http://docs.opencv.org/2.3/modules/features2d/doc/common_interfaces_of_descriptor_extractors.html