Melhore a correspondência de pontos de recurso com o OpenCV

Eu quero combinar pontos de recurso em imagens estéreo. Eu já encontrei e extraí os pontos de recurso com diferentes algoritmos e agora preciso de uma boa correspondência. Neste caso, estou usando os algoritmos FAST para detecção e extração e osBruteForceMatcher para combinar os pontos de recurso.

O código correspondente:

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

Como há muitas correspondências falsas, calculei a distância mínima e máxima e removi todas as correspondências que são muito ruins:

//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]); 
    }
}

O problema é que eu recebo muitas correspondências falsas ou apenas algumas corretas (veja as imagens abaixo).

muitos jogos com resultados ruins http://codemax.de/upl/badMatchesFAST.png apenas alguns bons jogos http://codemax.de/upl/goodMatchesFAST.png

Eu acho que não é um problema de programação, mas mais uma coisa de correspondência. Tanto quanto eu entendi oBruteForceMatcher&nbsp;considera apenas a distância visual dos pontos de recurso (que é armazenada noFeatureExtractor), não a distância local (posição x e y), que também é importante no meu caso. Alguém tem alguma experiência com este problema ou uma boa ideia para melhorar os resultados correspondentes?

EDITAR

Eu mudei o código, isso me deu as 50 melhores combinações. Depois disso, passo pela primeira partida para verificar se está em uma área específica. Se não for, tiro a próxima partida até encontrar uma correspondência dentro da área especificada.

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

Acho que não consigo mais correspondências, mas com isso consigo remover mais correspondências falsas:

menos, mas melhores características http://codemax.de/upl/img001.png