Verbessern Sie die Übereinstimmung von Feature-Punkten mit OpenCV

Möchte ich match feature-Punkte im stereo-Bilder. Hab ich schon gefunden und extrahiert die Funktion Punkte mit verschiedenen algorithmen und jetzt brauche ich ein gutes matching. In diesem Fall bin ich mit der SCHNELLEN algorithmen für Erkennung und Extraktion und die BruteForceMatcher für das matching der feature-Punkte.

Dem passenden code:

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

Weil es eine Menge von falschen Spiele ich caluclated die min-und max-Abstand und entfernen Sie alle Spiele, die sind zu schlecht:

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

Das problem ist, dass entweder ich bekomme eine Menge von falschen Spiele oder nur ein paar rechts (siehe Bilder unten).

viele Spiele mit schlechten Ergebnissen http://codemax.de/upl/badMatchesFAST.png
nur ein paar gute Spiele http://codemax.de/upl/goodMatchesFAST.png

Ich denke, es ist nicht ein problem der Programmierung, sondern mehr eine passende Sache. Soweit ich das verstanden BruteForceMatcher nur in Bezug auf die visuelle Distanz des feature-Punkte (die gespeichert ist in der FeatureExtractor), nicht die lokale Abstand (x&y-position), das ist in meinem Fall auch wichtig. Hat jemand irgendwelche Erfahrungen mit diesem problem oder eine gute Idee zur Verbesserung der matching-Ergebnisse?

BEARBEITEN

Änderte ich den code, es gibt mir die 50 besten Spiele. Nach diesem gehe ich durch das erste Spiel, um zu überprüfen, ob es in einem bestimmten Bereich. Wenn nicht, nehme ich das nächste Spiel, bis ich gefunden habe, ein match innerhalb der vorgegebenen Fläche.

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

Ich glaube, dass ich nicht mehr Spiele, aber mit diesem bin ich in der Lage zu entfernen mehr Fehltreffer:

weniger, aber bessere features http://codemax.de/upl/img001.png

InformationsquelleAutor der Frage filla2003 | 2013-07-31

Schreibe einen Kommentar