7

私は、フリーク_デモ.cpp の例に従って、OpenCV の最新バージョンから非常に新しい記述子 FREAK を試して ます。SURF を使用する代わりに、FAST を使用します。私の基本的なコードは次のようなものです:

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);
  • アルゴリズムは多くの一致を見つけますが、多くの外れ値があります。私は正しいことをしていますか?アルゴリズムを調整する方法はありますか?
4

2 に答える 2

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

必要な結果が得られるまで、さまざまなしきい値と距離を試してください。

于 2012-12-12T08:14:49.630 に答える
3

独自に選択したペアを指定して、記述子をトレーニングすることもできます。そして、コンストラクターでパラメーターを調整します。

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

ところで、FREAKのより効率的なバージョンが進行中です:-)

于 2012-12-12T09:27:44.420 に答える