gpt4 book ai didi

c++ - OpenCV 的 SIFT 匹配数作为第一个关键点数

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:19:43 25 4
gpt4 key购买 nike

使用此代码,当我打印匹配项数时,我得到的数字与第一张图像中找到的关键点数相同...例如一个输出可以是

关键点数量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匹配[i].queryIdx

::match 的第一个参数指的是 queryDescriptors(即 queryIdx)

关于c++ - OpenCV 的 SIFT 匹配数作为第一个关键点数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28151705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com