Mejora la coincidencia de puntos de características con OpenCV

Quiero hacer coincidir puntos de características en imágenes estéreo. Ya he encontrado y extraído los puntos de características con diferentes algoritmos y ahora necesito una buena coincidencia. En este caso estoy usando los algoritmos FAST para la detección y extracción y elBruteForceMatcher para hacer coincidir los puntos de características.

El código coincidente:

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

Debido a que hay muchas coincidencias falsas, calculé la distancia mínima y máxima y elimino todas las coincidencias que son demasiado malas:

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

El problema es que obtengo muchas coincidencias falsas o solo algunas correctas (vea las imágenes a continuación).

muchas coincidencias con malos resultados http://codemax.de/upl/badMatchesFAST.png solo algunas buenas coincidencias http://codemax.de/upl/goodMatchesFAST.png

Creo que no es un problema de programación, sino más bien una cuestión de coincidencia. Por lo que entendíBruteForceMatcher solo se refiere a la distancia visual de los puntos de característica (que se almacena en elFeatureExtractor), no la distancia local (posición x & y), que en mi caso también es importante. ¿Alguien tiene alguna experiencia con este problema o una buena idea para mejorar los resultados coincidentes?

EDITAR

Cambié el código, que me da las 50 mejores coincidencias. Después de esto, paso por el primer partido para verificar si está en un área específica. Si no es así, tomo el siguiente partido hasta que encuentre un partido dentro del área dada.

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

Creo que no obtengo más coincidencias, pero con esto puedo eliminar más coincidencias falsas:

Menos pero mejores características http://codemax.de/upl/img001.png

Respuestas a la pregunta(3)

Su respuesta a la pregunta