하나의 입력 이미지와 비교하여 목록에 많은 이미지가있는 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);
나는 내가 대단히 감사하겠습니다 사용해야합니다!
"가장 많은 inliers와 일치하는 것이 가장 적합합니다."라는 문구는 무엇입니까? –
그게 내가 생각한 첫 번째 문제 였지만, 시도했을 때 정확한 결과를 얻지 못했습니다. – tversteeg
좋아, 그래서 이미지 (심지어 거짓 것들) 꽤 비슷합니다. 모든 일치 또는 모든 inliers의 평균 거리를 취하면 정확도는 어떻게됩니까? 이것이 실패한 예시 사진을 게시 할 수 있습니까? –