OpenCV DescriptorMatcher radiusMatch 和 knnMatch 结果格式
Posted
技术标签:
【中文标题】OpenCV DescriptorMatcher radiusMatch 和 knnMatch 结果格式【英文标题】:OpenCV DescriptorMatcher radiusMatch and knnMatch result format 【发布时间】:2012-02-29 22:19:04 【问题描述】:有谁知道为什么 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
中,对象的位置。当我刚刚绘制它们时,这些点对我来说似乎是分散的,所以我想我错过了嵌套向量所代表的内容。
【问题讨论】:
【参考方案1】:knnMatch
函数将返回 k
最近邻匹配,即,如果您调用 knnMatch(queryDescriptors, trainDescriptors, matchesQueryToTrain, 3)
,在这种情况下为 k=3
,那么对于每个训练点,它将从查询中找到 3 个最佳匹配设置。
就您的vector<vector<DMatch>>
而言,这意味着外部vector
是每个query->train 匹配的向量,而内部vector
是您的k
最接近匹配的向量。
在this 其他问题中有一个很好的例子来说明如何使用这些k
匹配以及交叉检查方法。
如果您想要一个简单的 1-1 匹配,那么您可以使用 k=1 调用 knnMatch,这将返回一个大小为 1 的内部向量,或者只调用 match
,它以 vector<DMatch>
的形式输出匹配,没有第二个向量。
【讨论】:
以上是关于OpenCV DescriptorMatcher radiusMatch 和 knnMatch 结果格式的主要内容,如果未能解决你的问题,请参考以下文章