DescriptorMatcher OpenCV的火车()(DescriptorMatcher Op

2019-10-24 09:12发布

的OpenCV的文档中提到的功能“列车()”一DescriptorMatcher内。

“虚拟无效CV :: CUDA :: DescriptorMatcher ::列车()
纯虚

火车描述符匹配。

列车的描述符匹配(例如,FLANN索引)。 在所有方法中进行匹配,该方法列车()运行之前匹配每次“。(文档)

这一切都在那里说。 是否有人知道热它的工作原理? 尤其是什么DescriptorMatcher需要自己培养。 在一些OOP语言简单例子将是惊人的。

这里是链接到的文档:

http://docs.opencv.org/master/dd/dc5/classcv_1_1cuda_1_1DescriptorMatcher.html#ab220b434f827962455f430a12c65c074

提前致谢

Answer 1:

你可以看到的匹配代码在这里

列车的描述符匹配(例如,FLANN索引)。 在所有方法中进行匹配,该方法列车()是匹配之前运行的每一次。

是的,正如你可以从代码,看到train()被调用的匹配功能。

void DescriptorMatcher::knnMatch( InputArray queryDescriptors, std::vector<std::vector<DMatch> >& matches, int knn,
                                  InputArrayOfArrays masks, bool compactResult )
{
    if( empty() || queryDescriptors.empty() )
        return;

    CV_Assert( knn > 0 );

    checkMasks( masks, queryDescriptors.size().height );

    train();
    knnMatchImpl( queryDescriptors, matches, knn, masks, compactResult );
}

void DescriptorMatcher::radiusMatch( InputArray queryDescriptors, std::vector<std::vector<DMatch> >& matches, float maxDistance,
                                     InputArrayOfArrays masks, bool compactResult )
{
    matches.clear();
    if( empty() || queryDescriptors.empty() )
        return;

    CV_Assert( maxDistance > std::numeric_limits<float>::epsilon() );

    checkMasks( masks, queryDescriptors.size().height );

    train();
    radiusMatchImpl( queryDescriptors, matches, maxDistance, masks, compactResult );
}

当你调用match()它实际上将调用knnMatchknn = 1

void DescriptorMatcher::match( InputArray queryDescriptors, std::vector<DMatch>& matches, InputArrayOfArrays masks )
{
    std::vector<std::vector<DMatch> > knnMatches;
    knnMatch( queryDescriptors, knnMatches, 1, masks, true /*compactResult*/ );
    convertMatches( knnMatches, matches );
}

的基本实现train()什么也不做:

void DescriptorMatcher::train()
{}

只有FlannBasedMatcher重载train()

void FlannBasedMatcher::train()
{
    if( !flannIndex || mergedDescriptors.size() < addedDescCount )
    {
        // FIXIT: Workaround for 'utrainDescCollection' issue (PR #2142)
        if (!utrainDescCollection.empty())
        {
            CV_Assert(trainDescCollection.size() == 0);
            for (size_t i = 0; i < utrainDescCollection.size(); ++i)
                trainDescCollection.push_back(utrainDescCollection[i].getMat(ACCESS_READ));
        }
        mergedDescriptors.set( trainDescCollection );
        flannIndex = makePtr<flann::Index>( mergedDescriptors.getDescriptors(), *indexParams );
    }
}

有关如何使用一个例子FlannBasedMatcher你可以参考OpenCV的文档实例

你可以参考这个答案要知道什么是在训练阶段完成。 总之,你建立了匹配的索引。 你可以找到源代码在这里



文章来源: DescriptorMatcher OpenCV train()