Улучшить сопоставление характерных точек с OpenCV

Я хочу сопоставить характерные точки в стереоизображениях. Я уже нашел и извлек характерные точки с помощью различных алгоритмов, и теперь мне нужно хорошее сопоставление. В этом случае я использую алгоритмы FAST для обнаружения и извлечения иBruteForceMatcher для соответствия характерных точек.

Соответствующий код:

vector< vector<DMatch> > matches;
//using either FLANN or BruteForce
Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create(algorithmName);
matcher->knnMatch( descriptors_1, descriptors_2, matches, 1 );

//just some temporarily code to have the right data structure
vector< DMatch > good_matches2;
good_matches2.reserve(matches.size());  
for (size_t i = 0; i < matches.size(); ++i)
{ 
    good_matches2.push_back(matches[i][0]);     
}

Поскольку существует много ложных совпадений, я вычислил минимальное и максимальное расстояние и удалил все слишком плохие совпадения:

//calculation of max and min distances between keypoints
double max_dist = 0; double min_dist = 100;
for( int i = 0; i < descriptors_1.rows; i++ )
{
    double dist = good_matches2[i].distance;
    if( dist < min_dist ) min_dist = dist;
    if( dist > max_dist ) max_dist = dist;
}

//find the "good" matches
vector< DMatch > good_matches;
for( int i = 0; i < descriptors_1.rows; i++ )
{
    if( good_matches2[i].distance <= 5*min_dist )
    {
        good_matches.push_back( good_matches2[i]); 
    }
}

Проблема в том, что я либо получаю много ложных совпадений, либо только несколько правильных (см. Изображения ниже).

много совпадений с плохими результатами http://codemax.de/upl/badMatchesFAST.png только несколько хороших совпадений http://codemax.de/upl/goodMatchesFAST.png

Я думаю, что это не проблема программирования, а скорее подходящая вещь. Насколько я понялBruteForceMatcher касается только визуального расстояния характерных точек (которое хранится вFeatureExtractor), а не локальное расстояние (положение x & y), что также важно в моем случае. Есть ли у кого-нибудь опыт с этой проблемой или хорошая идея для улучшения результатов сопоставления?

РЕДАКТИРОВАТЬ

Я изменил код, чтобы он дал мне 50 лучших совпадений. После этого я прохожу первый матч, чтобы проверить, находится ли он в указанной области. Если это не так, я беру следующий матч, пока не найду совпадение в данной области.

vector< vector<DMatch> > matches;
Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create(algorithmName);
matcher->knnMatch( descriptors_1, descriptors_2, matches, 50 );

//look if the match is inside a defined area of the image
double tresholdDist = 0.25 * sqrt(double(leftImageGrey.size().,height*leftImageGrey.size().height + leftImageGrey.size().width*leftImageGrey.size().width));

vector< DMatch > good_matches2;
good_matches2.reserve(matches.size());  
for (size_t i = 0; i < matches.size(); ++i)
{ 
    for (int j = 0; j < matches[i].size(); j++)
    {
    //calculate local distance for each possible match
    Point2f from = keypoints_1[matches[i][j].queryIdx].pt;
    Point2f to = keypoints_2[matches[i][j].trainIdx].pt;        
    double dist = sqrt((from.x - to.x) * (from.x - to.x) + (from.y - to.y) * (from.y - to.y));
    //save as best match if local distance is in specified area
    if (dist < tresholdDist)
    {
        good_matches2.push_back(matches[i][j]);
        j = matches[i].size();
    }
}

Я думаю, что я не получаю больше совпадений, но с этим я могу удалить больше ложных совпадений:

меньше, но лучше функций http://codemax.de/upl/img001.png

Ответы на вопрос(3)

Ваш ответ на вопрос