Я пытаюсь создать фильтр для облака точек:
for each point (pI) in the point cloud
search his nearest neighbor (pN) in the point cloud
if distance (pI, pN) > threshold
delete pI
Для этого я использую алгоритм фланга OpenCV.Я создаю свое дерево, а затем смотрю на ближайшего соседа, используя это дерево.
Для тестов я пробовал с облаком точек другого размера, и для облака точек размером 4,5 миллиона требуется много времени (> 10 минут).И мое облако очков может иметь более 2 или 3 миллиардов очков.В этом случае это будет ужасно долго.
Мой вопрос таков: я думал о создании октодерева сначала с облаком точек, а затем на каждом листе октдри создания kdtree.Это будет хорошая техника?Или что-то существует для моего случая?Я искал в интернете, но нашел только исследовательскую работу, на переписывание которой у меня ушло бы много времени, потому что я один и у меня пока нет большого опыта ...
РЕДАКТИРОВАТЬ: Вот кодЯ использую для теста:
int main(int argc, char** argv) {
const int NUMBER_MAX = 4500000;
std::vector<cv::Point3f> cvTargetCloud;
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution(1, 1000);
int dice_roll = distribution(generator);
for (int i = 0; i < NUMBER_MAX; ++i) {
cvTargetCloud.push_back(cv::Point3f(distribution(generator), distribution(generator), distribution(generator)));
}
std::cout << " finished " << std::endl;
cv::flann::KDTreeIndexParams indexParams(16);
cv::flann::Index kdtree(cv::Mat(cvTargetCloud).reshape(1), indexParams);
std::cout << " finished " << std::endl;
int k = 2; //number of nearest neighbors
std::vector<int> indices(k);
std::vector<float> dists(k);
std::vector<float> query;
query.resize(3);
for (int i = 0; i < NUMBER_MAX; ++i) {
query[0] = cvTargetCloud[i].x;
query[1] = cvTargetCloud[i].y;
query[2] = cvTargetCloud[i].z;
kdtree.knnSearch(query, indices, dists, k, cv::flann::SearchParams(64));
}
std::cout << "finished";
}