Используя этот код, когда я печатаю количество совпадений, я получаю то же число, что и количество ключевых точек, найденных на первом изображении …
Например, один вывод может быть
Количество точек 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;
В зависимости от порядка параметров, для достижения вашей потребности инвертировать заказ:
matcher.match(descriptors1, descriptors2, matches);
в
matcher.match(descriptors2, descriptors1, matches);
Будьте осторожны с используемым порядком, даже документы OpenCV путают порядок matcher.match
вызов и позже инвертирует matches[i].trainIdx
а также matches[i].queryIdx
первый параметр ::match
ссылается на queryDescriptors (т.е. queryIdx
)