BFMatcher knnMatch
BFMatcher knnMatch
我尝试在 BFMatcher 上实现 knnMatch,如下所示:
BFMatcher matcher(NORM_L2, true);
vector<DMatch> matches;
//matcher.match(descriptors1, descriptors2, matches);
matcher.knnMatch(descriptors1, descriptors2, matches, 2);
并收到以下错误:
fiducialMain.cpp: In function ‘void fiducialCalc(cv::Mat, cv::Mat, cv::Mat&, cv::Mat&, int&)’:
fiducialMain.cpp:98:56: error: no matching function for call to ‘cv::BFMatcher::knnMatch(cv::Mat&, cv::Mat&, std::vector<cv::DMatch>&, int)’
matcher.knnMatch(descriptors1, descriptors2, matches,2);
^
fiducialMain.cpp:98:56: note: candidates are:
In file included from fiducialMain.cpp:15:0:
/usr/local/include/opencv2/features2d/features2d.hpp:1116:18: note: void cv::DescriptorMatcher::knnMatch(const cv::Mat&, const cv::Mat&, std::vector<std::vector<cv::DMatch> >&, int, const cv::Mat&, bool) const
CV_WRAP void knnMatch( const Mat& queryDescriptors, const Mat& trainDescriptors,
^
/usr/local/include/opencv2/features2d/features2d.hpp:1116:18: note: no known conversion for argument 3 from ‘std::vector<cv::DMatch>’ to ‘std::vector<std::vector<cv::DMatch> >&’
/usr/local/include/opencv2/features2d/features2d.hpp:1130:18: note: void cv::DescriptorMatcher::knnMatch(const cv::Mat&, std::vector<std::vector<cv::DMatch> >&, int, const std::vector<cv::Mat>&, bool)
CV_WRAP void knnMatch( const Mat& queryDescriptors, CV_OUT vector<vector<DMatch> >& matches, int k,
^
/usr/local/include/opencv2/features2d/features2d.hpp:1130:18: note: no known conversion for argument 2 from ‘cv::Mat’ to ‘std::vector<std::vector<cv::DMatch> >&’
谁能解释这个错误?
请再看一遍the docs
而普通匹配函数的结果是 vector<DMatch>
,
knnMatch(大声说:k-nearest-neighbours!)产生几个(k)个向量,因此你需要一个:
vector< vector< DMatch > > 匹配
结果
您对 BFMatcher 的论点不正确。当您将 crossCheck 设置为 true 时,每个关键点只能有一个匹配项。然而,对于 knnMatch 你需要有多个匹配项。所以你的代码应该是这样的:
BFMatcher matcher(NORM_L2);
std::vector<vector<DMatch> > matches;
matcher.knnMatch(descriptors1, descriptors2, matches,2);
std::vector<DMatch> match1;
std::vector<DMatch> match2;
for(int i=0; i<matches.size(); i++)
{
match1.push_back(matches[i][0]);
match2.push_back(matches[i][1]);
}
Mat img_matches1, img_matches2;
drawMatches(img1, kp1, img2, kp2, match1, img_matches1);
drawMatches(img1, kp1, img2, kp2, match2, img_matches2);
我尝试在 BFMatcher 上实现 knnMatch,如下所示:
BFMatcher matcher(NORM_L2, true);
vector<DMatch> matches;
//matcher.match(descriptors1, descriptors2, matches);
matcher.knnMatch(descriptors1, descriptors2, matches, 2);
并收到以下错误:
fiducialMain.cpp: In function ‘void fiducialCalc(cv::Mat, cv::Mat, cv::Mat&, cv::Mat&, int&)’:
fiducialMain.cpp:98:56: error: no matching function for call to ‘cv::BFMatcher::knnMatch(cv::Mat&, cv::Mat&, std::vector<cv::DMatch>&, int)’
matcher.knnMatch(descriptors1, descriptors2, matches,2);
^
fiducialMain.cpp:98:56: note: candidates are:
In file included from fiducialMain.cpp:15:0:
/usr/local/include/opencv2/features2d/features2d.hpp:1116:18: note: void cv::DescriptorMatcher::knnMatch(const cv::Mat&, const cv::Mat&, std::vector<std::vector<cv::DMatch> >&, int, const cv::Mat&, bool) const
CV_WRAP void knnMatch( const Mat& queryDescriptors, const Mat& trainDescriptors,
^
/usr/local/include/opencv2/features2d/features2d.hpp:1116:18: note: no known conversion for argument 3 from ‘std::vector<cv::DMatch>’ to ‘std::vector<std::vector<cv::DMatch> >&’
/usr/local/include/opencv2/features2d/features2d.hpp:1130:18: note: void cv::DescriptorMatcher::knnMatch(const cv::Mat&, std::vector<std::vector<cv::DMatch> >&, int, const std::vector<cv::Mat>&, bool)
CV_WRAP void knnMatch( const Mat& queryDescriptors, CV_OUT vector<vector<DMatch> >& matches, int k,
^
/usr/local/include/opencv2/features2d/features2d.hpp:1130:18: note: no known conversion for argument 2 from ‘cv::Mat’ to ‘std::vector<std::vector<cv::DMatch> >&’
谁能解释这个错误?
请再看一遍the docs
而普通匹配函数的结果是 vector<DMatch>
,
knnMatch(大声说:k-nearest-neighbours!)产生几个(k)个向量,因此你需要一个:
vector< vector< DMatch > > 匹配
结果
您对 BFMatcher 的论点不正确。当您将 crossCheck 设置为 true 时,每个关键点只能有一个匹配项。然而,对于 knnMatch 你需要有多个匹配项。所以你的代码应该是这样的:
BFMatcher matcher(NORM_L2);
std::vector<vector<DMatch> > matches;
matcher.knnMatch(descriptors1, descriptors2, matches,2);
std::vector<DMatch> match1;
std::vector<DMatch> match2;
for(int i=0; i<matches.size(); i++)
{
match1.push_back(matches[i][0]);
match2.push_back(matches[i][1]);
}
Mat img_matches1, img_matches2;
drawMatches(img1, kp1, img2, kp2, match1, img_matches1);
drawMatches(img1, kp1, img2, kp2, match2, img_matches2);