// ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- // Copyright (c) 2018-2023 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- #pragma once #include #include #include #include "open3d/geometry/Geometry.h" #include "open3d/geometry/KDTreeSearchParam.h" #include "open3d/pipelines/registration/Feature.h" /// @cond namespace nanoflann { struct metric_L2; template struct KDTreeEigenMatrixAdaptor; } // namespace nanoflann /// @endcond namespace open3d { namespace geometry { /// \class KDTreeFlann /// /// \brief KDTree with FLANN for nearest neighbor search. class KDTreeFlann { public: /// \brief Default Constructor. KDTreeFlann(); /// \brief Parameterized Constructor. /// /// \param data Provides set of data points for KDTree construction. KDTreeFlann(const Eigen::MatrixXd &data); /// \brief Parameterized Constructor. /// /// \param geometry Provides geometry from which KDTree is constructed. KDTreeFlann(const Geometry &geometry); /// \brief Parameterized Constructor. /// /// \param feature Provides a set of features from which the KDTree is /// constructed. KDTreeFlann(const pipelines::registration::Feature &feature); ~KDTreeFlann(); KDTreeFlann(const KDTreeFlann &) = delete; KDTreeFlann &operator=(const KDTreeFlann &) = delete; public: /// Sets the data for the KDTree from a matrix. /// /// \param data Data points for KDTree Construction. bool SetMatrixData(const Eigen::MatrixXd &data); /// Sets the data for the KDTree from geometry. /// /// \param geometry Geometry for KDTree Construction. bool SetGeometry(const Geometry &geometry); /// Sets the data for the KDTree from the feature data. /// /// \param feature Set of features for KDTree construction. bool SetFeature(const pipelines::registration::Feature &feature); template int Search(const T &query, const KDTreeSearchParam ¶m, std::vector &indices, std::vector &distance2) const; template int SearchKNN(const T &query, int knn, std::vector &indices, std::vector &distance2) const; template int SearchRadius(const T &query, double radius, std::vector &indices, std::vector &distance2) const; template int SearchHybrid(const T &query, double radius, int max_nn, std::vector &indices, std::vector &distance2) const; private: /// \brief Sets the KDTree data from the data provided by the other methods. /// /// Internal method that sets all the members of KDTree by data provided by /// features, geometry, etc. bool SetRawData(const Eigen::Map &data); protected: using KDTree_t = nanoflann::KDTreeEigenMatrixAdaptor< Eigen::Map, -1, nanoflann::metric_L2, false>; std::vector data_; std::unique_ptr> data_interface_; std::unique_ptr nanoflann_index_; size_t dimension_ = 0; size_t dataset_size_ = 0; }; } // namespace geometry } // namespace open3d