ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
ecvKDTreeFlann.cpp
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #ifdef _MSC_VER
9 #pragma warning(push)
10 #pragma warning(disable : 4267)
11 #endif
12 
13 #include "ecvKDTreeFlann.h"
14 
15 // CV_CORE_LIB
16 #include <Logging.h>
17 
18 #include <nanoflann.hpp>
19 
20 // LOCAL
21 #include "HalfEdgeTriangleMesh.h"
22 #include "ecvHObjectCaster.h"
23 #include "ecvMesh.h"
24 #include "ecvPointCloud.h"
25 
26 namespace cloudViewer {
27 namespace geometry {
28 
30 
31 KDTreeFlann::KDTreeFlann(const Eigen::MatrixXd &data) { SetMatrixData(data); }
32 
33 KDTreeFlann::KDTreeFlann(const ccHObject &geometry) { SetGeometry(geometry); }
34 
36  SetFeature(feature);
37 }
38 
40 
41 bool KDTreeFlann::SetMatrixData(const Eigen::MatrixXd &data) {
42  return SetRawData(Eigen::Map<const Eigen::MatrixXd>(
43  data.data(), data.rows(), data.cols()));
44 }
45 
46 bool KDTreeFlann::SetGeometry(const ccHObject &geometry) {
47  switch (geometry.getClassID()) {
48  case CV_TYPES::POINT_CLOUD: {
49  const auto &cloud = dynamic_cast<const ccPointCloud &>(geometry);
50  std::vector<Eigen::Vector3d> points = cloud.getEigenPoints();
51  return SetRawData(Eigen::Map<const Eigen::MatrixXd>(
52  (const double *)points.data(), 3, points.size()));
53  }
54  case CV_TYPES::MESH: {
55  const auto &mesh = dynamic_cast<const ccMesh &>(geometry);
56  std::vector<Eigen::Vector3d> points = mesh.getEigenVertices();
57  return SetRawData(Eigen::Map<const Eigen::MatrixXd>(
58  (const double *)points.data(), 3, points.size()));
59  }
61  const auto &mesh =
62  dynamic_cast<const HalfEdgeTriangleMesh &>(geometry);
63  return SetRawData(Eigen::Map<const Eigen::MatrixXd>(
64  (const double *)mesh.vertices_.data(), 3,
65  mesh.vertices_.size()));
66  }
67  case CV_TYPES::IMAGE:
69  default:
71  "[KDTreeFlann::SetGeometry] Unsupported Geometry type.");
72  return false;
73  }
74 }
75 
77  return SetMatrixData(feature.data_);
78 }
79 
80 bool KDTreeFlann::SetRawData(const Eigen::Map<const Eigen::MatrixXd> &data) {
81  dimension_ = data.rows();
82  dataset_size_ = data.cols();
83  if (dimension_ == 0 || dataset_size_ == 0) {
84  utility::LogWarning("[KDTreeFlann::SetRawData] Failed due to no data.");
85  return false;
86  }
87  data_.resize(dataset_size_ * dimension_);
88  memcpy(data_.data(), data.data(),
89  dataset_size_ * dimension_ * sizeof(double));
90  data_interface_.reset(new Eigen::Map<const Eigen::MatrixXd>(
91  (const double *)data_.data(), dimension_, dataset_size_));
92  nanoflann_index_.reset(
93  new KDTree_t(dimension_, std::cref(*data_interface_), 15));
94  nanoflann_index_->index_->buildIndex();
95  return true;
96 }
97 
98 template int KDTreeFlann::Search<Eigen::Vector3d>(
99  const Eigen::Vector3d &query,
100  const KDTreeSearchParam &param,
101  std::vector<int> &indices,
102  std::vector<double> &distance2) const;
103 template int KDTreeFlann::Query<Eigen::Vector3d>(
104  const std::vector<Eigen::Vector3d> &queries,
105  const KDTreeSearchParam &param,
106  std::vector<std::vector<int>> &indices,
107  std::vector<std::vector<double>> &distance2) const;
108 template int KDTreeFlann::SearchKNN<Eigen::Vector3d>(
109  const Eigen::Vector3d &query,
110  int knn,
111  std::vector<int> &indices,
112  std::vector<double> &distance2) const;
113 template int KDTreeFlann::SearchRadius<Eigen::Vector3d>(
114  const Eigen::Vector3d &query,
115  double radius,
116  std::vector<int> &indices,
117  std::vector<double> &distance2) const;
118 template int KDTreeFlann::SearchHybrid<Eigen::Vector3d>(
119  const Eigen::Vector3d &query,
120  double radius,
121  int max_nn,
122  std::vector<int> &indices,
123  std::vector<double> &distance2) const;
124 
125 template int KDTreeFlann::Search<Eigen::VectorXd>(
126  const Eigen::VectorXd &query,
127  const KDTreeSearchParam &param,
128  std::vector<int> &indices,
129  std::vector<double> &distance2) const;
130 template int KDTreeFlann::Query<Eigen::VectorXd>(
131  const std::vector<Eigen::VectorXd> &queries,
132  const KDTreeSearchParam &param,
133  std::vector<std::vector<int>> &indices,
134  std::vector<std::vector<double>> &distance2) const;
135 template int KDTreeFlann::SearchKNN<Eigen::VectorXd>(
136  const Eigen::VectorXd &query,
137  int knn,
138  std::vector<int> &indices,
139  std::vector<double> &distance2) const;
140 template int KDTreeFlann::SearchRadius<Eigen::VectorXd>(
141  const Eigen::VectorXd &query,
142  double radius,
143  std::vector<int> &indices,
144  std::vector<double> &distance2) const;
145 template int KDTreeFlann::SearchHybrid<Eigen::VectorXd>(
146  const Eigen::VectorXd &query,
147  double radius,
148  int max_nn,
149  std::vector<int> &indices,
150  std::vector<double> &distance2) const;
151 
152 } // namespace geometry
153 } // namespace cloudViewer
154 
155 #ifdef _MSC_VER
156 #pragma warning(pop)
157 #endif
int points
Hierarchical CLOUDVIEWER Object.
Definition: ecvHObject.h:25
CV_CLASS_ENUM getClassID() const override
Returns class ID.
Definition: ecvHObject.h:232
Triangular mesh.
Definition: ecvMesh.h:35
A 3D cloud and its associated features (color, normals, scalar fields, etc.)
HalfEdgeTriangleMesh inherits TriangleMesh class with the addition of HalfEdge data structure for eac...
bool SetMatrixData(const Eigen::MatrixXd &data)
bool SetFeature(const utility::Feature &feature)
std::unique_ptr< KDTree_t > nanoflann_index_
std::unique_ptr< Eigen::Map< const Eigen::MatrixXd > > data_interface_
bool SetGeometry(const ccHObject &geometry)
nanoflann::KDTreeEigenMatrixAdaptor< Eigen::Map< const Eigen::MatrixXd >, -1, nanoflann::metric_L2, false > KDTree_t
Base class for KDTree search parameters.
Class to store featrues for registration.
Definition: ecvFeature.h:29
Eigen::MatrixXd data_
Data buffer storing features.
Definition: ecvFeature.h:54
#define LogWarning(...)
Definition: Logging.h:72
GraphType data
Definition: graph_cut.cc:138
@ HIERARCHY_OBJECT
Definition: CVTypes.h:103
@ HALF_EDGE_MESH
Definition: CVTypes.h:150
@ MESH
Definition: CVTypes.h:105
@ IMAGE
Definition: CVTypes.h:114
@ POINT_CLOUD
Definition: CVTypes.h:104
Generic file read and write utility for python interface.