2012-12-12 56 views
7

我正在嘗試從最新版本的OpenCV開始的相當新的描述符FREAK,它們是:freak_demo.cpp 。我沒有使用SURF,而是使用FAST。我的基本代碼是這樣的:OpenCV FREAK返回太多異常值

std::vector<KeyPoint> keypointsA, keypointsB; 
Mat descriptorsA, descriptorsB; 
std::vector<DMatch> matches; 

FREAK extractor; 
BruteForceMatcher<Hamming> matcher; 

FAST(imgA,keypointsA,100); 
FAST(imgB,keypointsB,20); 

extractor.compute(imgA, keypointsA, descriptorsA); 
extractor.compute(imgB, keypointsB, descriptorsB); 

matcher.match(descriptorsA, descriptorsB, matches); 
  • 算法找到了很多比賽,但也有很多異常的。我做對了嗎?有沒有調整算法的方法?

回答

16

在做匹配有總是擺脫了異常的一些細化的步驟。

我最常做的是丟棄有距離超過閾值比賽,例如:

for (int i = 0; i < matches.size(); i++) 
{ 
    if(matches[i].distance > 200) 
    { 
     matches.erase(matches.begin()+i-1); 
    } 
} 

然後,我用RANSAC看哪個匹配適合單應模型。 OpenCV的這個功能:

for(int i = 0; i < matches.size(); i++) 
    {    
     trainMatches.push_back(cv::Point2f(keypointsB[ matches[i].trainIdx ].pt.x/500.0f, keypointsB[ matches[i].trainIdx ].pt.y/500.0f)); 
     queryMatches.push_back(cv::Point2f(keypointsA[ matches[i].queryIdx ].pt.x/500.0f, keypointsA[ matches[i].queryIdx ].pt.y/500.0f)); 
    } 

Mat h = cv::findHomography(trainMatches,queryMatches,CV_RANSAC,0.005, status); 

我只畫了正常值:

for(size_t i = 0; i < queryMatches.size(); i++) 
{ 
    if(status.at<char>(i) != 0) 
    { 
     inliers.push_back(matches[i]); 
    } 
} 

Mat imgMatch; 
drawMatches(imgA, keypointsA, imgB, keypointsB, inliers, imgMatch); 

剛剛嘗試不同的閾值和距離,直到你得到想要的resutls。

+0

我很好奇你_「丟棄有距離超過閾值的匹配」 _例子,但是當我試圖包括它在我的代碼,我得到的_錯誤「矢量迭代器+超出範圍偏移」 _? – MLMLTL

3

您還可以通過給自己的選擇對訓練描述符。並調整構造函數中的參數。

explicit FREAK(bool orientationNormalized = true 
     , bool scaleNormalized = true 
     , float patternScale = 22.0f 
     , int nbOctave = 4 
     , const vector<int>& selectedPairs = vector<int>() 
    ); 

BTW,FREAK的更高效的版本是在路上:-)

+0

高效通過該一個或多個參數?我需要強大的FREAK,而不是快速。我還需要強大的特徵檢測器,如MU-SURF。 –