【问题标题】:DescriptorMatcher OpenCV train()DescriptorMatcher OpenCV train()
【发布时间】:2015-07-31 10:54:40
【问题描述】:

OpenCV 的文档中提到了 DescriptorMatcher 中的函数“train()”。

“虚空 cv::cuda::DescriptorMatcher::train ( )
纯虚拟

训练一个描述符匹配器。

训练一个描述符匹配器(例如,flann 索引)。在所有要匹配的方法中,每次匹配前都会运行方法 train()。"(docs)

这就是那里的全部内容。有人知道热它有效吗?尤其是 DescriptorMatcher 需要训练自己的东西。一些 OOP 语言的简短示例将是惊人的。

这里是文档的链接:

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

提前致谢

【问题讨论】:

    标签: opencv matcher descriptor training-data


    【解决方案1】:

    你可以看到匹配器代码here

    训练一个描述符匹配器(例如,flann 索引)。在所有要匹配的方法中,每次匹配前都会运行方法 train()。

    是的,从代码中可以看出,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 doc example

    你可以参考这个answer来了解在训练阶段做了什么。简而言之,您正在为匹配器构建索引。可以找到源代码here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      • 2022-11-09
      • 2012-06-01
      • 1970-01-01
      • 2017-05-23
      相关资源
      最近更新 更多