2012-12-12 6 views
7

私はかなり新しい記述子FREAKを、OpenCVの最新バージョンのfreak_demo.cppexampleの次のバージョンから試しています。 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); 

をそして私はちょうどインライアを描く:あなたが希望resutlsを得るまで

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); 

ちょうど異なるしきい値との距離を試してみてください。

+0

:-)道を進んでいる私は_たとえば、あなたの_「閾値を超える距離を持って破棄マッチ」について興味があったが、私はしようとしたとき、私のコードに含めると、_ "ベクトルイテレータ+オフセットが範囲外です_"というエラーが発生します。 – MLMLTL

3

自分で選択したペアを指定することで、ディスクリプタをトレーニングすることもできます。コンストラクタのパラメータを調整します。ところで

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

、FREAKのより効率的なバージョン

+0

効率的なパラメータまたはパラメータですか?高速ではなく、堅牢なFREAKが必要です。私はまた、MU-SURFのような強力な特徴検出器が必要です。 –

関連する問題