gpt4 book ai didi

c++ - 在 OpenCV 的 FlannBasedMatcher 中,训练究竟发生在什么阶段?

转载 作者:太空宇宙 更新时间:2023-11-03 22:01:29 25 4
gpt4 key购买 nike

以下代码是用 C++ 编写的,我在实验中使用 OpenCV。假设我按以下方式使用 kd-tree (FlannBasedMatcher):

//these are inputs to the code snippet below. 
//They are filled with suitable values
Mat& queryDescriptors;
vector<Training> &trainCollection;
vector< vector<DMatch> >& matches;
int knn;

//setting flann parameters
const Ptr<flann::IndexParams>& indexParams=new flann::KDTreeIndexParams(4);
const Ptr<flann::SearchParams>& searchParams=new flann::SearchParams(64);
FlannBasedMatcher matcher(indexParams, searchParams);

for (int i = 0; i < trainCollection.size();i++){
Training train = trainCollection.at(i);
Mat trainDescriptors(train.trainDescriptors);
trainDescriptorCollection.push_back(trainDescriptors);
}
matcher.add(trainDescriptorCollection);
matcher.train();

//Now, we may do knnMatch (or anyother matching)
matcher.knnMatch(queryDescriptors,matches,knn);

在上面的代码中,似乎在调用 train() 函数时进行了训练(即构建了 kd-tree)。但是,如果我们查看 train() 函数的内部,问题就来了:

void FlannBasedMatcher::train()
{
if( flannIndex.empty() || mergedDescriptors.size() < addedDescCount )
{
mergedDescriptors.set( trainDescCollection );
flannIndex = new flann::Index( mergedDescriptors.getDescriptors(), *indexParams );
}
}

这两个操作(设置训练描述符和flann索引,我在调用train()之前已经完成)。那么kd-tree到底是什么时候建起来的呢?

最佳答案

当代码调用FlannBasedMatcher::train()时,FlannBasedMatcher的索引将由

flannIndex = new flann::Index( mergedDescriptors.getDescriptors(), *indexParams );

代码

if( flannIndex.empty() || mergedDescriptors.size() < addedDescCount )

是检查FlannBasedMatcher的索引是否已经建好,如果已经建好索引,train()函数会跳过建索引的过程,节省时间。

关于c++ - 在 OpenCV 的 FlannBasedMatcher 中,训练究竟发生在什么阶段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15047259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com