セット A と B の 2 次元ポイントの 2 つのセットがあります。セット A には 100 ポイントがあり、セット B には 5000 ポイントが含まれています。セット A の各ポイントについて、セット B から最近傍またはそれに最も近いポイントを見つけたいと思います。セット B に OpenCV kd-Tree を構築し、セット A ポイントをクエリ ポイントとして使用しました。
問題は、セット A のすべてのポイントに対して、Kd-tree が常に最初のポイントを最も近いポイントとして返すことです。ポイントを見ると、セット B の 1 番目のポイントよりもはるかに近いポイントが他にもあることがわかります。
ここにいくつかのコードがあります:
Mat matches; //This mat will contain the index of nearest neighbour as returned by Kd-tree
Mat distances; //In this mat Kd-Tree return the distances for each nearest neighbour
Mat ClusterMemebers; //This Set A
Mat ClusterCenters; //This set B
const cvflann::SearchParams params(32); //How many leaves to search in a tree
cv::flann::GenericIndex< cvflann::L2<int> > *kdtrees; // The flann searching tree
// Create matrices
ClusterCenters.create(cvSize(2,5000), CV_32S); // The set B
matches.create(cvSize(1,100), CV_32SC1);
distances.create(cvSize(1,100), CV_32FC1);
ClusterMembers.create(cvSize(2,100), CV_32S); // The set A
// After filling points in ClusterMembers (set A) and ClusterCenters (Set B)
// I create K-D tree
kdtrees = new flann::GenericIndex< cvflann::L2<int> >(ClusterCenters, vflann::KDTreeIndexParams(4)); // a 4 k-d tree
// Search KdTree
kdtrees->knnSearch(ClusterMembers, matches, distances, 1, cvflann::SearchParams(8));
int NN_index;
for(int l = 0; l < 100; l++)
{
NN_index = matches.at<float>(cvPoint(l, 0));
dist = distances.at<float>(cvPoint(l, 0));
}
はNN_index
常に 0 で、これは 1 番目のポイントを意味します。