C++ OpenCV描述符配置器半径匹配和knnMatch结果格式

C++ OpenCV描述符配置器半径匹配和knnMatch结果格式,c++,opencv,computer-vision,C++,Opencv,Computer Vision,有人知道为什么OpenCV 2DescriptorMatcher::radiusMatch()和knnMatch()采用向量和匹配吗?我有点困惑为什么它不只是一个向量,因为它只是场景中与训练图像相对应的一个点数组,对吗 我有这样的想法: void getMatchingPoints( const vector<vector<cv::DMatch> >& matches, const vector<cv::KeyPoint>& k

有人知道为什么OpenCV 2
DescriptorMatcher::radiusMatch()
knnMatch()
采用
向量和匹配吗?我有点困惑为什么它不只是一个向量,因为它只是场景中与训练图像相对应的一个点数组,对吗

我有这样的想法:

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));
        }
    }
}
void getMatchingPoints(
常量向量和匹配,
常量向量和密钥模板,
常量向量和keyptscene,
向量和ptsTemplate,
向量&ptsScene
)
{
ptsTemplate.clear();
ptsScene.clear();
对于(size_t k=0;k

但我有点困惑,一旦我把它们都放在
ptsScene
中,如何实际映射对象的大致位置。当我刚画这些点时,它们看起来很分散,所以我想我缺少了嵌套向量所表示的内容。

函数将返回
k
最近邻匹配,即如果调用
knnMatch(queryDescriptor,trainsDescriptor,matchesqueryTorain,3)
在这种情况下,
k=3
,然后,对于每个训练点,它将从查询集中找到3个最佳匹配项

对于您的
向量
,这意味着外部
向量
是每个查询->序列匹配的向量,而内部
向量
是您的
k
最近匹配的向量

在另一个问题中,有一个很好的例子说明了如何使用这些
k
匹配以及交叉检查方法

如果您想要一个简单的1-1匹配,那么您可以调用k=1的knnMatch,它将返回大小为1的内部向量,或者只调用
match
,它以
vector
的形式输出匹配,而不需要第二个向量