OpenCV номер SIFT всегда совпадает с первым номером точки

Используя этот код, когда я печатаю количество совпадений, я получаю то же число, что и количество ключевых точек, найденных на первом изображении …
Например, один вывод может быть

Количество точек 1: 682

количество точек 2: 159

количество матчей (FLANN): 682

количество матчей (Брут Форс): 682

как совпадения могут превышать количество ключевых точек на втором изображении? Я ожидаю, что количество совпадений будет меньше или равно минимуму между количеством ключевых точек двух изображений.

cv::SiftFeatureDetector  detector;
detector = SiftFeatureDetector(
0, // nFeatures
4, // nOctaveLayers
0.04, // contrastThreshold
10, //edgeThreshold
1.6 //sigma
);std::vector<KeyPoint> keypoints1, keypoints2;

int dxP = gray1.rows / 10;

cv::Mat mask = cv::Mat::zeros(gray1.size(), CV_8U); // all 0
mask(Rect(dxP, dxP, gray1.cols - 2*dxP, gray1.rows - 2*dxP)) = 1;

detector.detect(gray1, keypoints1, mask);
cout << "number of keypoints1: " << keypoints1.size() << endl;

detector.detect(gray2, keypoints2, mask);
cout << "number of keypoints2: " << keypoints2.size() << endl;

SiftDescriptorExtractor extractor;
Mat descriptors1, descriptors2;
extractor.compute(gray1, keypoints1, descriptors1);
extractor.compute(gray2, keypoints2, descriptors2);

//Matching descriptor vectors using FLANN matcher
FlannBasedMatcher matcher;
std::vector< DMatch > matches;
matcher.match(descriptors1, descriptors2, matches);
cout << "number of matches (FLANN): " << matches.size() << endl;

// Matching descriptor vectors using Brute Force matcher
BFMatcher BFmatcher(NORM_L2);
vector<DMatch> BFmatches;
BFmatcher.match(descriptors1, descriptors2, BFmatches);

cout << "number of matches (Brute Force): " << BFmatches.size() << endl;

2

Решение

В зависимости от порядка параметров, для достижения вашей потребности инвертировать заказ:

matcher.match(descriptors1, descriptors2, matches);

в

matcher.match(descriptors2, descriptors1, matches);

Будьте осторожны с используемым порядком, даже документы OpenCV путают порядок matcher.match вызов и позже инвертирует matches[i].trainIdx а также matches[i].queryIdx

первый параметр ::match ссылается на queryDescriptors (т.е. queryIdx)

1

Другие решения


По вопросам рекламы [email protected]