Opencv комбинация октри и фланна - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь создать фильтр для облака точек:

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";
}
...