的OpenCV的文档中提到的功能“列车()”一DescriptorMatcher内。
“虚拟无效CV :: CUDA :: DescriptorMatcher ::列车()
纯虚
火车描述符匹配。
列车的描述符匹配(例如,FLANN索引)。 在所有方法中进行匹配,该方法列车()运行之前匹配每次“。(文档)
这一切都在那里说。 是否有人知道热它的工作原理? 尤其是什么DescriptorMatcher需要自己培养。 在一些OOP语言简单例子将是惊人的。
这里是链接到的文档:
http://docs.opencv.org/master/dd/dc5/classcv_1_1cuda_1_1DescriptorMatcher.html#ab220b434f827962455f430a12c65c074
提前致谢
你可以看到的匹配代码在这里
列车的描述符匹配(例如,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()
它实际上将调用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的文档实例
你可以参考这个答案要知道什么是在训练阶段完成。 总之,你建立了匹配的索引。 你可以找到源代码在这里