Ich versuche, ein C++ - Programm zu erstellen, wo viele Bilder in einer Liste verglichen mit einem Eingabebild sind. Ich habe die ganze Sache funktioniert und das Programm erstellt DMatch
Matches.OpenCV: Vergleichen mehrerer Bilder mit ORB
Jetzt versuche ich festzustellen, welche der Liste der Bilder, die mit dem Quellbild verglichen wird, die beste Übereinstimmung ist. Ich habe zuerst versucht, dies zu tun, indem ich nur die Anzahl der Übereinstimmungen zwischen den Bildern verglichen habe, aber das Problem ist, dass wenn ein generiertes Bild viele Schlüsselpunkte hat; Sie haben auch eine Menge Übereinstimmungen, zumindest in meinem Programm.
Also, wie kann ich feststellen, welche der Anordnung von Bildern ist die beste Übereinstimmung mit dem Quellbild? Ich verwende diese Schleife die Spiele, um zu bestimmen, aber es funktioniert nicht wirklich:
vector< vector<DMatch> > filteredMatches;
vector<int> goodIds;
Ptr<DescriptorMatcher> matcher(new BFMatcher(NORM_HAMMING, false));
printf("bad matches: ");
for(size_t i = 0; i < images.size();i++){
vector<DMatch> matches, good_matches;
matcher->clear();
matcher->match(images[i], tex_des, matches);
if(matches.size() < 8){
printf("F%d,", (int)i + 1);
continue;
}
double min_dist = 100;
for(size_t j = 0; j < matches.size(); j++){
double dist = matches[j].distance;
if(dist < min_dist)
min_dist = dist;
}
if(min_dist > 50.0){
printf("D%d,", (int)i + 1);
continue;
}
double good_dist = min_dist * 3;
for(size_t j = 0; j < matches.size(); j++){
if(matches[j].distance < good_dist)
good_matches.push_back(matches[j]);
}
size_t size = good_matches.size();
if(size < 8){
printf("M%d,", (int)i + 1);
continue;
}
vector<Point2f> srcPoints(size);
vector<Point2f> dstPoints(size);
for(size_t j = 0; j < size; j++){
srcPoints[j] = destination[good_matches[j].trainIdx].pt;
dstPoints[j] = keyPoints[i][good_matches[j].queryIdx].pt;
}
vector<unsigned char> inliersMask(srcPoints.size());
Mat H = findHomography(srcPoints, dstPoints, CV_FM_RANSAC, 3.0, inliersMask);
vector<DMatch> inliers;
for(size_t j = 0; j < inliersMask.size(); j++){
if(inliersMask[j]){
inliers.push_back(good_matches[j]);
}
}
if(inliers.size() < 4){
printf("S%d,", (int)i + 1);
continue;
}
filteredMatches.push_back(inliers);
goodIds.push_back((int)i);
H.release();
}
printf(" good matches: ");
int best = -1;
int amount = 0;
for(size_t i = 0; i < filteredMatches.size(); i++){
int size = (int)filteredMatches.at(i).size();
if(size < 8) continue;
printf("%d,", goodIds[i] + 1);
if(amount < size){
amount = size;
best = i;
}
}
if(best >= 0) printf(" best match on image: %d, keypoints: %d, ", goodIds[best] + 1, amount);
Wenn mich jemand auf die Funktionen oder die Logik Punkt kann ich muss verwenden würde ich es sehr zu schätzen!
Was ist das Problem mit der Aussage "Das Match mit den meisten Inliers ist meine beste Übereinstimmung."? –
Das war das erste, woran ich auch dachte, aber als ich es probierte, bekam ich keine genauen Ergebnisse. – tversteeg
OK, also die Bilder (sogar die falschen) sind ziemlich ähnlich, denke ich. Wie ist die Genauigkeit, wenn Sie die durchschnittliche Distanz aller Spiele oder aller Inliers nehmen? Können Sie Beispielbilder veröffentlichen, bei denen dies fehlschlägt? –