簡體   English   中英

OpenCV:SIFT檢測和匹配方法

[英]OpenCV: SIFT detection and matching methods

從OpenCV文檔中:

C++:void SIFT::operator()(InputArray img, InputArray mask, vector<KeyPoint>& keypoints,
 OutputArray descriptors, bool useProvidedKeypoints=false)

參數:

img – Input 8-bit grayscale image
mask – Optional input mask that marks the regions where we should detect features.
keypoints – The input/output vector of keypoints
descriptors – The output matrix of descriptors. Pass cv::noArray() 
if you do not need them.
useProvidedKeypoints – Boolean flag. If it is true, the keypoint 
detector is not run. Instead, the provided vector of keypoints is
 used and the algorithm just computes their descriptors.

我有以下問題:

  1. mask具有什么值? 我的意思是,如果我想刪除圖像邊界附近的關鍵點,我應該給蒙版添加一個邊界為零,中間為零的蒙版?

  2. 在另一個網頁上,我找到了另一種方法,該方法使用“檢測”方法檢測關鍵點,並使用“計算”​​方法計算描述符。 使用檢測/計算功能與使用“運算符”功能有什么區別? 使用第一種方法時,我首先檢測關鍵點而不計算描述符...但是,相反,如果我使用帶有useProvidedKeypoints標志的方法“ operator”,那么我之前必須如何計算關鍵點?

  3. 此外,就匹配點數而言,蠻力匹配和FLANN匹配有什么區別? 我需要使用MATLAB的VL_FEAT庫獲得相同的結果...所以我想知道兩種方法中哪一種更接近

例如,以下Matlab代碼為我提供了2546個檢測到的關鍵點

 [f1,d1] = vl_sift(frame1_gray);

使用OpenCV:

std::vector<KeyPoint> keypoints;
cv::SiftFeatureDetector detector;
detector.detect(gray1, keypoints);
cout << keypoints.size() << endl;

才708!

然后,使用SIFT :: operator(),我輸入的參數有問題

std::vector<KeyPoint> keypoints;
Mat descriptors;
SIFT S = SIFT();
SIFT::operator(gray1, Mat(), keypoints, descriptors);

讓我們一個一個地回答您的問題:

  1. 面膜是您指定的,這樣你可以控制關鍵點的檢測發生的輸入圖像。 有時,您不想檢測整個圖像上的關鍵點,而是想定位要檢測關鍵點的位置,或者找到圖像的一個部分以捕獲關鍵點。 之所以如此,是因為可能需要進行一些預處理才能在圖像中定位顯着區域。 例如,如果要進行人臉識別,則只希望檢測人臉的關鍵點,而不是整個圖像。 因此,可能有一個步驟,您首先要了解面部在圖像中的位置,然后將關鍵點檢測僅定位到這些區域。

  2. 檢測和計算顯然是兩件事。 檢測是確定圖像中的哪些像素位置是有效的關鍵點。 計算描述了這些特定位置的關鍵點。 興趣點檢測器的成功不僅在於它們具有足夠的可重復性和魯棒性以使其能夠被檢測到,而且描述關鍵點的方法正是使它們變得受歡迎的原因。

    這分別暗示了檢測器和描述符。 有一些框架,例如SIFT和SURF都是檢測和描述框架。 SIFT / SURF(大致)在128-bin向量中計算方向的直方圖,並且還具有基於高斯差的近似值的檢測框架。 如果我可以建議一個鏈接,請看一下以下內容: 檢測器,提取器和匹配器的分類 -他們討論了所有不同的檢測器,描述符以及匹配關鍵點的方法。 useProvidedKeypoints (OpenCV中: http://docs.opencv.org/2.4.1/modules/nonfree/doc/feature_detection.html#sift-operator )標志意味着你已經確定的像素位置在圖像中你要為其計算描述符。 這樣,SIFT將繞過算法的檢測階段,並將僅計算那些像素位置的描述符。

  3. 蠻力和FLANN(近似最近鄰居的快速庫-http: //www.cs.ubc.ca/research/flann/ )之間的區別在於匹配關鍵點的機制。 對於給定的關鍵點,您要確定此關鍵點是否與圖像中檢測到的任何其他關鍵點匹配。 一種方法是搜索所有關鍵點(蠻力)或關鍵點子 (FLANN)。 FLANN在高維空間中執行最近鄰居搜索,因此它限制了您在搜索關鍵點的位置。 這顯然比蠻力要快得多,但這全取決於您的應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM