有没有人碰巧知道为什么OpenCV 2 DescriptorMatcher::radiusMatch()
和knnMatch()
会占用vector<vector<DMatch>>& matches
?我有点困惑为什么它不仅仅是一个矢量,因为它只是场景中与训练图像相对应的单个点阵,对吧?
我有这样的事情:
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
中,该对象的位置。当我绘制它们时,这些点似乎散落在我身上,所以我想我错过了嵌套向量所代表的内容。
答案 0 :(得分:24)
knnMatch
函数将返回k
最近邻居匹配,即如果您在这种情况下调用knnMatch(queryDescriptors, trainDescriptors, matchesQueryToTrain, 3)
k=3
,那么对于每个训练点,它将会从查询集中找到3个最佳匹配。
就vector<vector<DMatch>>
而言,这意味着外vector
是每个查询 - &gt;列车匹配的向量,内vector
是k
的向量1}}最近的匹配。
在this其他问题中,如何使用这些k
匹配以及交叉检查方法有很好的例子。
如果你想要简单的1-1匹配,那么你可以调用k = 1的knnMatch,它将返回一个大小为1的内部向量,或者只调用match
,它以{{1}的形式输出匹配没有第二个向量。