我想创建一个C++程序,其中有一个列表中的图像与一个输入图像相比有很多图像。我得到了整个事情的工作,该计划正在创建DMatch
比赛。OpenCV:使用ORB比较多个图像
现在我正在尝试确定与源图像比较的图像列表中的哪一个是最匹配的。我首先试图通过比较图像之间的哪些匹配来做到这一点,但问题是当生成的图像有很多关键点时;他们也往往有很多比赛,至少在我的计划中。
那么如何确定哪个图像阵列与源图像最匹配呢?我使用这个循环,以确定比赛,但它并没有真正的工作:
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);
如果有人能指点功能或逻辑我必须用我将不胜感激!
说“与最内层的匹配是我最好的搭配”有什么问题? – 2013-03-08 14:38:24
这也是我想到的第一件事,但是当我尝试它时,我没有得到任何准确的结果。 – tversteeg 2013-03-08 14:40:17
好的,所以图片(甚至是假的)与我猜的很相似。如果您取所有比赛或所有比赛的平均距离,准确度如何?你可以发布图片失败的例子吗? – 2013-03-08 15:03:16