Próbuję utworzyć program C++, w którym na liście znajduje się wiele obrazów w porównaniu do jednego obrazu wejściowego. Mam wszystko działa, a program tworzy mecze DMatch
.OpenCV: Porównanie wielu obrazów za pomocą ORB
Teraz próbuję ustalić, która z listy obrazów porównywanych z obrazem źródłowym najlepiej pasuje. Najpierw próbowałem to zrobić, porównując po prostu liczbę dopasowań między obrazami, ale problem polega na tym, że wygenerowany obraz ma wiele kluczowych punktów; oni również mają dużo meczów, przynajmniej w moim programie.
Jak zatem określić, która z obrazów najlepiej pasuje do obrazu źródłowego? Używam tej pętli określić mecze, ale to naprawdę nie działa:
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);
Jeśli ktoś może wskazać mi funkcji lub logiką muszę używać będę bardzo wdzięczny!
Co to jest problem z powiedzeniem "Mecz z największą liczbą inline to mój najlepszy mecz."? –
To była pierwsza rzecz, o której myślałem, ale kiedy spróbowałem, nie uzyskałem dokładnych wyników. – tversteeg
OK, więc obrazy (nawet te fałszywe) są całkiem podobne, jak sądzę. Jaka jest dokładność, jeśli bierzesz średnią odległość wszystkich meczów lub wszystkich inklosów? Czy możesz umieścić przykładowe zdjęcia, jeśli to się nie powiedzie? –