【发布时间】:2015-03-24 23:01:43
【问题描述】:
使用此代码,当我打印匹配数时,我得到的数字与第一张图像中找到的关键点数相同... 例如,一个输出可能是
关键点数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;
【问题讨论】:
-
不是 100% 确定,但我猜想从第一组到第二组计算完全匹配。这意味着,对于第一组的每个描述符,搜索第二组的最接近的描述符。所以如果 |s1| > |s2| s1 的多个描述符将与 s2 的相同描述符匹配。只需使用docs.opencv.org/modules/features2d/doc/…的
CROSS-CHECK参数即可
标签: c++ opencv matching sift feature-extraction