1

次のコードは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ツリーが構築される)ようです。しかし、train()関数の内部を見ると、ここに問題があります。

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

これらの操作の両方(トレーニング記述子とflannインデックスの設定、train()を呼び出す前にすでに行っています)。では、kdツリーはいつ構築されるのでしょうか。

4

2 に答える 2

3

コードがFlannBasedMatcher::train()を呼び出すと、FlannBasedMatcherのインデックスはによって作成されます

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

コード

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

FlannBasedMatcherのインデックスが以前に作成されているかどうかを確認することです。インデックスが以前に作成されている場合、train()関数は時間を節約するためにインデックスを作成するプロセスをスキップします。

于 2013-03-12T13:41:26.450 に答える
2

ドキュメントから、トレーニング(つまり、kdツリーを構築するcaeで)は、照合する前に毎回実行されます。クラスは、cv::DescriptorMatcher必要に応じてトレーニングメソッドautomaticallyallを呼び出します。

于 2013-03-04T12:42:13.937 に答える