2011-05-30 74 views
6

Matching with nothing in the top right corner的OpenCV 2.2 SURF特徵匹配問題

我已經修改OpenCV的演示應用程序「matching_to_many_images.cpp」從網絡攝像頭(右)查詢圖像(左)至一個幀。第一張圖片右上角出了什麼問題?

我們認爲這與我們的另一個問題有關。我們從一個空的數據庫開始,我們只添加獨特的(與我們的數據庫中的功能不匹配的功能),但添加三個功能後,我們得到所有新功能的匹配... ...

我們正在使用: SurfFeatureDetector surfFeatureDetector(400,3,4); SurfDescriptorExtractor surfDescriptorExtractor; FlannBasedMatcher flannDescriptorMatcher; http://www.copypastecode.com/71973/

+0

要100%正確,它是右圖像的左上角。我們需要一種方式來篩選這些明顯錯誤的匹配,任何想法?爲什麼這些點被檢測爲匹配? – Orka 2011-05-30 09:37:45

+0

您應該將我的答案標記爲正確答案。實際的一個是誤導。 – 2013-05-12 12:28:34

回答

10

我覺得這與邊框的關鍵點做:

完整代碼可以在這裏找到。檢測器檢測關鍵點,但是對於SURF描述符返回一致的值,它需要圍繞它的像素塊中的像素數據,這在邊界像素中不可用。在檢測到關鍵點之後但計算描述符之前,可以使用以下片段刪除邊界點。我建議使用20或更多的borderSize。

removeBorderKeypoints(vector<cv::KeyPoint>& keypoints, const cv::Size imageSize, const boost::int32_t borderSize) 
{ 
    if(borderSize > 0) 
    { 
     keypoints.erase(remove_if(keypoints.begin(), keypoints.end(), 
           RoiPredicatePic((float)borderSize, (float)borderSize, 
              (float)(imageSize.width - borderSize), 
              (float)(imageSize.height - borderSize))), 
        keypoints.end()); 
    } 
} 

凡RoiPredicatePic實現爲:

struct RoiPredicatePic 
{ 
    RoiPredicatePic(float _minX, float _minY, float _maxX, float _maxY) 
    : minX(_minX), minY(_minY), maxX(_maxX), maxY(_maxY) 
    {} 

    bool operator()(const cv::KeyPoint& keyPt) const 
    { 
     cv::Point2f pt = keyPt.pt; 
     return (pt.x < minX) || (pt.x >= maxX) || (pt.y < minY) || (pt.y >= maxY); 
    } 

    float minX, minY, maxX, maxY; 
}; 

此外,近似最近鄰索引是不匹配的圖像對之間的功能的最佳途徑。我建議你嘗試其他更簡單的匹配器。

+0

整潔,好點!在我們的「生產」代碼中,我們轉而使用強力匹配器來代替。我將以您的代碼片段爲指導,研究這些要點。 – Orka 2011-05-31 06:15:08

+0

這解決了我們以前遇到的問題,並回答了問題。可悲的是,這不是我們的數據庫匹配問題的原因..回到調試! 感謝您的回答! – Maidenone 2011-05-31 10:00:07

4

您的方法工作完美無瑕,但由於錯誤地調用drawMatches函數而顯示錯誤結果。

你不正確的呼叫是這樣的:

drawMatches(image2, image2Keypoints, image1, image1Keypoints, matches, result); 

正確的調用應該是:

drawMatches(image1, image1Keypoints, image2, image2Keypoints, matches, result); 
3

我面臨同樣的問題。令人驚訝的是,該解決方案與邊界點或KNN匹配器無關。只需要一個不同的匹配策略來篩選出過多比賽中的「優秀比賽」。

使用2 NN搜索,並且以下條件 -

如果距離(1匹配)< 0.6 *距離(第二節比賽)第一次比賽是「門當戶對」。

過濾出所有不符合上述條件的匹配項,並僅爲「匹配項」調用drawMatches。瞧!