I am trying to create a C ++ program where there are many images in the list compared to a single input image. I got everything that works, and the program creates DMatch matches.
Now I'm trying to determine which of the image lists that are compared with the original image is the best match. At first I tried to do this by simply comparing the number of matches between the images, but the problem is that when the generated image has many key points; they also tend to have many matches, at least in my program.
So, how can I determine which image array is the best fit for the original image? I use this loop to determine matches, but it really doesn't work:
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);
If someone can point me to a function or logic that I should use, I would really appreciate it!
source share