有人碰巧知道为什么OpenCV 2 DescriptorMatcher :: radiusMatch()和knnMatch()取向量< vector< DMatch>&火柴?我有点困惑,为什么它不会只是一个向量,因为它只是一个点阵数在场景中对应的训练形象,对吧?
我有这样的东西:
void getMatchingPoints( const vector<vector<cv::DMatch> >& matches,const vector<cv::KeyPoint>& keyPtsTemplates,const vector<cv::KeyPoint>& keyPtsScene,vector<Vec2f>& ptsTemplate,vector<Vec2f>& ptsScene ) { ptsTemplate.clear(); ptsScene.clear(); for (size_t k = 0; k < matches.size(); k++) { for (size_t i = 0; i < matches[k].size(); i++) { const cv::DMatch& match = matches[k][i]; ptsScene.push_back(fromOcv(keyPtsScene[match.queryIdx].pt)); ptsTemplate.push_back(fromOcv(keyPtsTemplates[match.trainIdx].pt)); } } }
但我有点困惑,如何实际映射大约.一旦我把它们全部放在ptsScene中,对象的位置.当我画画时,点数似乎分散在我身上,所以我想我错过了嵌套向量所代表的东西.
解决方法
knnMatch函数将返回k个近邻匹配,即如果调用knnMatch(queryDescriptors,trainDescriptors,matchesQueryToTrain,3),在这种情况下k = 3,则对于每个训练点,它将从查询中找到3个最佳匹配项组.
根据您的向量< vector< DMatch>>,这意味着外部向量是每个查询 – >列车匹配的向量,并且内部向量是您的k个最近匹配的向量.
有一个很好的例子,如何使用这些k个匹配以及一个交叉检查方法在this其他问题.
如果你想要一个简单的1-1匹配,那么你可以使用k = 1调用knnMatch,这将返回大小为1的内部向量,或者只是调用匹配哪个输出在格式向量< DMatch>中匹配.没有第二个矢量.