OpenCV FREAK возвращает слишком много выбросов

Я пробую совершенно новый дескриптор FREAK из последней версии OpenCV после freak_demo.cpp пример. Вместо использования 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);
  • Алгоритм находит много совпадений, но есть много выбросов. Я все делаю правильно? Есть ли способ настройки алгоритма?

7

Решение

При выполнении согласование всегда есть некоторые уточняющие шаги для избавления от выбросов.

Я обычно отбрасываю матчи, которые имеют расстояние над порогом, например:

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

Просто попробуйте разные пороги и расстояния, пока не получите желаемый результат.

16

Другие решения

Вы также можете обучить дескриптор, предоставив свои собственные выбранные пары. И настройте параметры в конструкторе.

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

Кстати, более эффективная версия FREAK уже в пути 🙂

3

По вопросам рекламы [email protected]