OpenCV的文档提到了函数" train()"在DescriptorMatcher中。
" virtual void cv :: cuda :: DescriptorMatcher :: train()
纯虚拟
训练描述符匹配器。
训练描述符匹配器(例如,flann索引)。在所有要匹配的方法中,方法train()在匹配之前每次运行。"(docs)
那里有人说的全部。有人知道它有效吗?特别是DescriptorMatcher需要训练自己的东西。一些OOP语言的简短例子会很棒。
以下是文档的链接:
提前致谢
答案 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