有谁碰巧知道为什么OpenCV 2 DescriptorMatcher::radiusMatch()
和knnMatch()
采用vector<vector<DMatch>>& matches
?我对为什么它不只是 vector 感到有些困惑,因为它只是场景中与训练图像相对应的单点阵列,对吗?
我有这样的事情:
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
中,就可以确定对象的位置。当我刚绘制它们时,这些点在我看来似乎分散了,所以我想我错过了嵌套 vector 所代表的意思。 最佳答案
knnMatch
函数将返回k
最近邻匹配项,即,如果您调用knnMatch(queryDescriptors, trainDescriptors, matchesQueryToTrain, 3)
,在这种情况下为k=3
,则对于每个训练点,它将从查询集中找到3个最佳匹配项。
就您的vector<vector<DMatch>>
而言,这意味着外部vector
是每个query-> train匹配的 vector ,而内部vector
是您的k
最接近的匹配的 vector 。
有一个很好的例子,说明如何使用这些k
匹配项以及this其他问题中的交叉检查方法。
如果要进行简单的1-1匹配,则可以使用k = 1调用knnMatch,这将返回大小为1的内部 vector ,或者仅调用match
,其输出形式为vector<DMatch>
而没有第二个 vector 。
关于c++ - OpenCV DescriptorMatcher radiusMatch和knnMatch结果格式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9507545/