DescriptorMatcher OpenCV火车()

时间:2015-07-31 10:54:40

标签: opencv matcher descriptor training-data

OpenCV的文档提到了函数" train()"在DescriptorMatcher中。

" virtual void cv :: cuda :: DescriptorMatcher :: train()
    纯虚拟

训练描述符匹配器。

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

那里有人说的全部。有人知道它有效吗?特别是DescriptorMatcher需要训练自己的东西。一些OOP语言的简短例子会很棒。

以下是文档的链接:

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

提前致谢

1 个答案:

答案 0 :(得分: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()时,它会使用knnMatch

实际调用knn = 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