我想創建一個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