Open3D (C++ API)
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
PointCloud.h
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - Open3D: www.open3d.org -
3 // ----------------------------------------------------------------------------
4 // The MIT License (MIT)
5 //
6 // Copyright (c) 2018 www.open3d.org
7 //
8 // Permission is hereby granted, free of charge, to any person obtaining a copy
9 // of this software and associated documentation files (the "Software"), to deal
10 // in the Software without restriction, including without limitation the rights
11 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 // copies of the Software, and to permit persons to whom the Software is
13 // furnished to do so, subject to the following conditions:
14 //
15 // The above copyright notice and this permission notice shall be included in
16 // all copies or substantial portions of the Software.
17 //
18 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
24 // IN THE SOFTWARE.
25 // ----------------------------------------------------------------------------
26 
27 #pragma once
28 
29 #include <Eigen/Core>
30 #include <memory>
31 #include <tuple>
32 #include <vector>
33 
36 
37 namespace open3d {
38 
39 namespace camera {
40 class PinholeCameraIntrinsic;
41 }
42 
43 namespace geometry {
44 
45 class Image;
46 class RGBDImage;
47 class TriangleMesh;
48 class VoxelGrid;
49 
50 class PointCloud : public Geometry3D {
51 public:
53  ~PointCloud() override {}
54 
55 public:
56  PointCloud &Clear() override;
57  bool IsEmpty() const override;
58  Eigen::Vector3d GetMinBound() const override;
59  Eigen::Vector3d GetMaxBound() const override;
60  Eigen::Vector3d GetCenter() const override;
61  AxisAlignedBoundingBox GetAxisAlignedBoundingBox() const override;
62  OrientedBoundingBox GetOrientedBoundingBox() const override;
63  PointCloud &Transform(const Eigen::Matrix4d &transformation) override;
64  PointCloud &Translate(const Eigen::Vector3d &translation,
65  bool relative = true) override;
66  PointCloud &Scale(const double scale, bool center = true) override;
67  PointCloud &Rotate(const Eigen::Vector3d &rotation,
68  bool center = true,
69  RotationType type = RotationType::XYZ) override;
70 
71  PointCloud &operator+=(const PointCloud &cloud);
72  PointCloud operator+(const PointCloud &cloud) const;
73 
74  bool HasPoints() const { return points_.size() > 0; }
75 
76  bool HasNormals() const {
77  return points_.size() > 0 && normals_.size() == points_.size();
78  }
79 
80  bool HasColors() const {
81  return points_.size() > 0 && colors_.size() == points_.size();
82  }
83 
85  for (size_t i = 0; i < normals_.size(); i++) {
86  normals_[i].normalize();
87  }
88  return *this;
89  }
90 
92  PointCloud &PaintUniformColor(const Eigen::Vector3d &color) {
93  ResizeAndPaintUniformColor(colors_, points_.size(), color);
94  return *this;
95  }
96 
100  PointCloud &RemoveNoneFinitePoints(bool remove_nan = true,
101  bool remove_infinite = true);
102 
106  std::shared_ptr<PointCloud> SelectDownSample(
107  const std::vector<size_t> &indices, bool invert = false) const;
108 
113  std::shared_ptr<PointCloud> VoxelDownSample(double voxel_size) const;
114 
117  std::tuple<std::shared_ptr<PointCloud>, Eigen::MatrixXi>
118  VoxelDownSampleAndTrace(double voxel_size,
119  const Eigen::Vector3d &min_bound,
120  const Eigen::Vector3d &max_bound,
121  bool approximate_class = false) const;
122 
125  std::shared_ptr<PointCloud> UniformDownSample(size_t every_k_points) const;
126 
130  std::shared_ptr<PointCloud> Crop(const Eigen::Vector3d &min_bound,
131  const Eigen::Vector3d &max_bound) const;
132 
135  std::tuple<std::shared_ptr<PointCloud>, std::vector<size_t>>
136  RemoveRadiusOutliers(size_t nb_points, double search_radius) const;
137 
140  std::tuple<std::shared_ptr<PointCloud>, std::vector<size_t>>
141  RemoveStatisticalOutliers(size_t nb_neighbors, double std_ratio) const;
142 
148  bool EstimateNormals(
149  const KDTreeSearchParam &search_param = KDTreeSearchParamKNN(),
150  bool fast_normal_computation = true);
151 
155  bool OrientNormalsToAlignWithDirection(
156  const Eigen::Vector3d &orientation_reference =
157  Eigen::Vector3d(0.0, 0.0, 1.0));
158 
162  bool OrientNormalsTowardsCameraLocation(
163  const Eigen::Vector3d &camera_location = Eigen::Vector3d::Zero());
164 
170  std::vector<double> ComputePointCloudDistance(const PointCloud &target);
171 
174  std::tuple<Eigen::Vector3d, Eigen::Matrix3d> ComputeMeanAndCovariance()
175  const;
176 
180  std::vector<double> ComputeMahalanobisDistance() const;
181 
184  std::vector<double> ComputeNearestNeighborDistance() const;
185 
187  std::shared_ptr<TriangleMesh> ComputeConvexHull() const;
188 
194  std::vector<int> ClusterDBSCAN(double eps,
195  size_t min_points,
196  bool print_progress = false) const;
197 
205  static std::shared_ptr<PointCloud> CreateFromDepthImage(
206  const Image &depth,
207  const camera::PinholeCameraIntrinsic &intrinsic,
208  const Eigen::Matrix4d &extrinsic = Eigen::Matrix4d::Identity(),
209  double depth_scale = 1000.0,
210  double depth_trunc = 1000.0,
211  int stride = 1);
212 
216  static std::shared_ptr<PointCloud> CreateFromRGBDImage(
217  const RGBDImage &image,
218  const camera::PinholeCameraIntrinsic &intrinsic,
219  const Eigen::Matrix4d &extrinsic = Eigen::Matrix4d::Identity());
220 
224  std::shared_ptr<PointCloud> CreateFromVoxelGrid(
225  const VoxelGrid &voxel_grid);
226 
227 public:
228  std::vector<Eigen::Vector3d> points_;
229  std::vector<Eigen::Vector3d> normals_;
230  std::vector<Eigen::Vector3d> colors_;
231 };
232 
233 } // namespace geometry
234 } // namespace open3d
Definition: Geometry.h:32
Definition: BoundingVolume.h:90
Definition: PinholeCameraIntrinsic.h:42
Definition: BoundingVolume.h:38
Definition: PointCloud.h:50
bool HasPoints() const
Definition: PointCloud.h:74
RotationType
Definition: Geometry3D.h:43
PointCloud & NormalizeNormals()
Definition: PointCloud.h:84
std::vector< Eigen::Vector3d > points_
Definition: PointCloud.h:228
PointCloud()
Definition: PointCloud.h:52
PointCloud & PaintUniformColor(const Eigen::Vector3d &color)
Assigns each point in the PointCloud the same color.
Definition: PointCloud.h:92
std::vector< Eigen::Vector3d > colors_
Definition: PointCloud.h:230
Definition: Geometry3D.h:41
Definition: KDTreeSearchParam.h:32
Definition: RGBDImage.h:43
char type
Definition: FilePCD.cpp:56
std::vector< Eigen::Vector3d > normals_
Definition: PointCloud.h:229
bool HasNormals() const
Definition: PointCloud.h:76
Definition: PinholeCameraIntrinsic.cpp:34
~PointCloud() override
Definition: PointCloud.h:53
Definition: VoxelGrid.h:62
GeometryType
Definition: Geometry.h:34
bool HasColors() const
Definition: PointCloud.h:80
Definition: KDTreeSearchParam.h:53
Definition: Image.h:49