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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer alternativen Methode der Bestimmung von high-quality-Funktion entspricht ist die ratio-test vorgeschlagen, die von David Lowe in seiner Arbeit auf SIEBEN (Seite 20 für eine Erläuterung). Dieser test lehnt die Armen entspricht, durch berechnen des Verhältnisses zwischen der best-und second-best-match. Wenn das Verhältnis unter eine bestimmte Schwelle, wird das Spiel verworfen als low-Qualität.
InformationsquelleAutor der Antwort Aurelius
Durch den Vergleich alle feature detection algorithmen fand ich eine gute Kombination, das gibt mir viel mehr entspricht. Jetzt bin ich mit SCHNELL für feature-Erkennung, SIEBEN für die Merkmalsextraktion und BruteForce für das matching. Kombiniert mit der Kontrolle, ob die Spiele innerhalb einer definierten region, ich bekomme eine Menge von spielen, siehe Bild:
eine Menge gute Spiele mit SCHNELL und SIFT http://codemax.de/upl/FASTandSIFT.png
Den entsprechenden code:
InformationsquelleAutor der Antwort filla2003
Neben ratio-test können Sie:
Verwenden Sie nur symmetrische Spiele:
und da es ein stereo-Bild verwenden ransac-test:
InformationsquelleAutor der Antwort András Kovács