リストに1つの入力画像と比較して多数の画像がある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);
誰かが、私はそれを大幅に感謝機能や、私が使用しなければならないロジックに私を指すことができれば!
「は、ほとんどのインライアとの試合は私のベストマッチである。」と言っに問題は何ですか? –
それは私が思った最初のことでしたが、試してみると正確な結果は得られませんでした。 – tversteeg
OKだから、画像(偽のものも)はかなり類似していると思います。すべてのマッチまたはすべてのインライアの平均距離をとった場合の正確さはどのようになりますか?これが失敗する場所のサンプル画像を投稿できますか? –