Open3D (C++ API)  0.19.0
PointCloud.h
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - Open3D: www.open3d.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.open3d.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #pragma once
9 
10 #include <initializer_list>
11 #include <string>
12 #include <unordered_map>
13 #include <unordered_set>
14 
15 #include "open3d/core/Tensor.h"
26 #include "open3d/utility/Logging.h"
27 
28 namespace open3d {
29 namespace t {
30 namespace geometry {
31 
32 class LineSet;
33 
81 class PointCloud : public Geometry, public DrawableGeometry {
82 public:
86  PointCloud(const core::Device& device = core::Device("CPU:0"));
87 
95 
101  PointCloud(const std::unordered_map<std::string, core::Tensor>&
102  map_keys_to_tensors);
103 
104  virtual ~PointCloud() override {}
105 
107  std::string ToString() const;
108 
110  const TensorMap& GetPointAttr() const { return point_attr_; }
111 
114 
118  core::Tensor& GetPointAttr(const std::string& key) {
119  return point_attr_.at(key);
120  }
121 
123  core::Tensor& GetPointPositions() { return GetPointAttr("positions"); }
124 
126  core::Tensor& GetPointColors() { return GetPointAttr("colors"); }
127 
129  core::Tensor& GetPointNormals() { return GetPointAttr("normals"); }
130 
134  const core::Tensor& GetPointAttr(const std::string& key) const {
135  return point_attr_.at(key);
136  }
137 
140  return GetPointAttr("positions");
141  }
142 
144  const core::Tensor& GetPointColors() const {
145  return GetPointAttr("colors");
146  }
147 
149  const core::Tensor& GetPointNormals() const {
150  return GetPointAttr("normals");
151  }
152 
158  void SetPointAttr(const std::string& key, const core::Tensor& value) {
159  if (value.GetDevice() != device_) {
160  utility::LogError("Attribute device {} != Pointcloud's device {}.",
161  value.GetDevice().ToString(), device_.ToString());
162  }
163  point_attr_[key] = value;
164  }
165 
167  void SetPointPositions(const core::Tensor& value) {
168  core::AssertTensorShape(value, {std::nullopt, 3});
169  SetPointAttr("positions", value);
170  }
171 
173  void SetPointColors(const core::Tensor& value) {
174  core::AssertTensorShape(value, {std::nullopt, 3});
175  SetPointAttr("colors", value);
176  }
177 
179  void SetPointNormals(const core::Tensor& value) {
180  core::AssertTensorShape(value, {std::nullopt, 3});
181  SetPointAttr("normals", value);
182  }
183 
188  bool HasPointAttr(const std::string& key) const {
189  return point_attr_.Contains(key) && GetPointAttr(key).GetLength() > 0 &&
190  GetPointAttr(key).GetLength() == GetPointPositions().GetLength();
191  }
192 
197  void RemovePointAttr(const std::string& key) { point_attr_.Erase(key); }
198 
201  bool HasPointPositions() const { return HasPointAttr("positions"); }
202 
208  bool HasPointColors() const { return HasPointAttr("colors"); }
209 
215  bool HasPointNormals() const { return HasPointAttr("normals"); }
216 
217 public:
223  PointCloud To(const core::Device& device, bool copy = false) const;
224 
226  PointCloud Clone() const;
227 
229  PointCloud& Clear() override {
230  point_attr_.clear();
231  return *this;
232  }
233 
235  bool IsEmpty() const override { return !HasPointPositions(); }
236 
238  core::Tensor GetMinBound() const;
239 
241  core::Tensor GetMaxBound() const;
242 
244  core::Tensor GetCenter() const;
245 
251  PointCloud Append(const PointCloud& other) const;
252 
255  PointCloud operator+(const PointCloud& other) const {
256  return Append(other);
257  }
258 
284  PointCloud& Transform(const core::Tensor& transformation);
285 
291  PointCloud& Translate(const core::Tensor& translation,
292  bool relative = true);
293 
306  PointCloud& Scale(double scale, const core::Tensor& center);
307 
324  PointCloud& Rotate(const core::Tensor& R, const core::Tensor& center);
325 
331 
338  PointCloud SelectByMask(const core::Tensor& boolean_mask,
339  bool invert = false) const;
340 
350  bool invert = false,
351  bool remove_duplicates = false) const;
352 
357  PointCloud VoxelDownSample(double voxel_size,
358  const std::string& reduction = "mean") const;
359 
365  PointCloud UniformDownSample(size_t every_k_points) const;
366 
372  PointCloud RandomDownSample(double sampling_ratio) const;
373 
382  PointCloud FarthestPointDownSample(const size_t num_samples,
383  const size_t start_index = 0) const;
384 
392  std::tuple<PointCloud, core::Tensor> RemoveRadiusOutliers(
393  size_t nb_points, double search_radius) const;
394 
402  std::tuple<PointCloud, core::Tensor> RemoveStatisticalOutliers(
403  size_t nb_neighbors, double std_ratio) const;
404 
409  std::tuple<PointCloud, core::Tensor> RemoveDuplicatedPoints() const;
410 
418  std::tuple<PointCloud, core::Tensor> RemoveNonFinitePoints(
419  bool remove_nan = true, bool remove_infinite = true) const;
420 
422  core::Device GetDevice() const override { return device_; }
423 
439  std::tuple<TriangleMesh, core::Tensor> HiddenPointRemoval(
440  const core::Tensor& camera_location, double radius) const;
441 
454  core::Tensor ClusterDBSCAN(double eps,
455  size_t min_points,
456  bool print_progress = false) const;
457 
470  std::tuple<core::Tensor, core::Tensor> SegmentPlane(
471  const double distance_threshold = 0.01,
472  const int ransac_n = 3,
473  const int num_iterations = 100,
474  const double probability = 0.99999999) const;
475 
490  TriangleMesh ComputeConvexHull(bool joggle_inputs = false) const;
491 
502  std::tuple<PointCloud, core::Tensor> ComputeBoundaryPoints(
503  double radius,
504  int max_nn = 30,
505  double angle_threshold = 90.0) const;
506 
507 public:
510 
522  void EstimateNormals(const std::optional<int> max_nn = 30,
523  const std::optional<double> radius = std::nullopt);
524 
530  const core::Tensor& orientation_reference =
531  core::Tensor::Init<float>({0, 0, 1},
532  core::Device("CPU:0")));
533 
539  const core::Tensor& camera_location = core::Tensor::Zeros(
540  {3}, core::Float32, core::Device("CPU:0")));
541 
555  const double lambda = 0.0,
556  const double cos_alpha_tol = 1.0);
557 
572  const std::optional<int> max_nn = 30,
573  const std::optional<double> radius = std::nullopt);
574 
575 public:
601  const Image& depth,
602  const core::Tensor& intrinsics,
603  const core::Tensor& extrinsics =
605  float depth_scale = 1000.0f,
606  float depth_max = 3.0f,
607  int stride = 1,
608  bool with_normals = false);
609 
636  const RGBDImage& rgbd_image,
637  const core::Tensor& intrinsics,
638  const core::Tensor& extrinsics =
640  float depth_scale = 1000.0f,
641  float depth_max = 3.0f,
642  int stride = 1,
643  bool with_normals = false);
644 
646  static PointCloud FromLegacy(
647  const open3d::geometry::PointCloud& pcd_legacy,
648  core::Dtype dtype = core::Float32,
649  const core::Device& device = core::Device("CPU:0"));
650 
653 
656  int width,
657  int height,
658  const core::Tensor& intrinsics,
659  const core::Tensor& extrinsics =
661  float depth_scale = 1000.0f,
662  float depth_max = 3.0f);
663 
666  int width,
667  int height,
668  const core::Tensor& intrinsics,
669  const core::Tensor& extrinsics =
671  float depth_scale = 1000.0f,
672  float depth_max = 3.0f);
673 
676 
679 
682  bool robust = false) const;
683 
690  bool invert = false) const;
691 
697  PointCloud Crop(const OrientedBoundingBox& obb, bool invert = false) const;
698 
707  LineSet ExtrudeRotation(double angle,
708  const core::Tensor& axis,
709  int resolution = 16,
710  double translation = 0.0,
711  bool capping = true) const;
712 
719  LineSet ExtrudeLinear(const core::Tensor& vector,
720  double scale = 1.0,
721  bool capping = true) const;
722 
728  int PCAPartition(int max_points);
729 
741 
756 
764  const PointCloud& pcd2,
765  std::vector<Metric> metrics = {Metric::ChamferDistance},
766  MetricParameters params = MetricParameters()) const;
767 
783  bool IsGaussianSplat() const;
784 
789  int GaussianSplatGetSHOrder() const;
790 
791 protected:
794 };
795 
796 } // namespace geometry
797 } // namespace t
798 } // namespace open3d
math::float4 color
Definition: LineSetBuffers.cpp:45
#define LogError(...)
Definition: Logging.h:51
double t
Definition: SurfaceReconstructionPoisson.cpp:172
#define AssertTensorShape(tensor,...)
Definition: TensorCheck.h:58
size_t stride
Definition: TriangleMeshBuffers.cpp:163
bool copy
Definition: VtkUtils.cpp:74
Definition: Device.h:18
std::string ToString() const
Returns string representation of device, e.g. "CPU:0", "CUDA:0".
Definition: Device.cpp:88
Definition: Dtype.h:20
Definition: Tensor.h:32
int64_t GetLength() const
Definition: Tensor.h:1182
static Tensor Zeros(const SizeVector &shape, Dtype dtype, const Device &device=Device("CPU:0"))
Create a tensor fill with zeros.
Definition: Tensor.cpp:405
Device GetDevice() const override
Definition: Tensor.cpp:1556
static Tensor Eye(int64_t n, Dtype dtype, const Device &device)
Create an identity matrix of size n x n.
Definition: Tensor.cpp:417
A bounding box that is aligned along the coordinate axes and defined by the min_bound and max_bound.
Definition: BoundingVolume.h:285
The Image class stores image with customizable width, height, num of channels and bytes per channel.
Definition: Image.h:34
LineSet define a sets of lines in 3D. A typical application is to display the point cloud corresponde...
Definition: LineSet.h:30
A bounding box oriented along an arbitrary frame of reference.
Definition: BoundingVolume.h:138
Definition: BoundingVolume.h:20
A point cloud consists of point coordinates, and optionally point colors and point normals.
Definition: PointCloud.h:36
RGBDImage is for a pair of registered color and depth images,.
Definition: RGBDImage.h:27
Mix-in class for geometry types that can be visualized.
Definition: DrawableGeometry.h:19
The base geometry class.
Definition: Geometry.h:23
A point cloud contains a list of 3D points.
Definition: PointCloud.h:81
std::tuple< PointCloud, core::Tensor > RemoveStatisticalOutliers(size_t nb_neighbors, double std_ratio) const
Remove points that are further away from their nb_neighbor neighbors in average. This function is not...
Definition: PointCloud.cpp:670
core::Tensor & GetPointAttr(const std::string &key)
Definition: PointCloud.h:118
bool HasPointAttr(const std::string &key) const
Definition: PointCloud.h:188
PointCloud & PaintUniformColor(const core::Tensor &color)
Assigns uniform color to the point cloud.
Definition: PointCloud.cpp:774
PointCloud UniformDownSample(size_t every_k_points) const
Downsamples a point cloud by selecting every kth index point and its attributes.
Definition: PointCloud.cpp:561
PointCloud & Clear() override
Clear all data in the point cloud.
Definition: PointCloud.h:229
PointCloud & Rotate(const core::Tensor &R, const core::Tensor &center)
Rotates the PointPositions and PointNormals (if exists).
Definition: PointCloud.cpp:415
std::tuple< core::Tensor, core::Tensor > SegmentPlane(const double distance_threshold=0.01, const int ransac_n=3, const int num_iterations=100, const double probability=0.99999999) const
Segment PointCloud plane using the RANSAC algorithm. This is a wrapper for a CPU implementation and a...
Definition: PointCloud.cpp:1403
PointCloud Crop(const AxisAlignedBoundingBox &aabb, bool invert=false) const
Function to crop pointcloud into output pointcloud.
Definition: PointCloud.cpp:1526
TriangleMesh ComputeConvexHull(bool joggle_inputs=false) const
Definition: PointCloud.cpp:1425
std::tuple< PointCloud, core::Tensor > RemoveRadiusOutliers(size_t nb_points, double search_radius) const
Remove points that have less than nb_points neighbors in a sphere of a given radius.
Definition: PointCloud.cpp:642
std::tuple< PointCloud, core::Tensor > RemoveDuplicatedPoints() const
Remove duplicated points and there associated attributes.
Definition: PointCloud.cpp:732
const core::Tensor & GetPointPositions() const
Get the value of the "positions" attribute. Convenience function.
Definition: PointCloud.h:139
geometry::RGBDImage ProjectToRGBDImage(int width, int height, const core::Tensor &intrinsics, const core::Tensor &extrinsics=core::Tensor::Eye(4, core::Float32, core::Device("CPU:0")), float depth_scale=1000.0f, float depth_max=3.0f)
Project a point cloud to an RGBD image.
Definition: PointCloud.cpp:1251
bool HasPointPositions() const
Definition: PointCloud.h:201
bool HasPointColors() const
Definition: PointCloud.h:208
PointCloud & Scale(double scale, const core::Tensor &center)
Scales the PointPositions of the PointCloud.
Definition: PointCloud.cpp:387
const core::Tensor & GetPointAttr(const std::string &key) const
Definition: PointCloud.h:134
core::Tensor & GetPointNormals()
Get the value of the "normals" attribute. Convenience function.
Definition: PointCloud.h:129
core::Device device_
Definition: PointCloud.h:792
PointCloud & NormalizeNormals()
Normalize point normals to length 1.
Definition: PointCloud.cpp:754
void OrientNormalsConsistentTangentPlane(size_t k, const double lambda=0.0, const double cos_alpha_tol=1.0)
Function to consistently orient estimated normals based on consistent tangent planes as described in ...
Definition: PointCloud.cpp:982
PointCloud To(const core::Device &device, bool copy=false) const
Definition: PointCloud.cpp:293
std::tuple< PointCloud, core::Tensor > ComputeBoundaryPoints(double radius, int max_nn=30, double angle_threshold=90.0) const
Compute the boundary points of a point cloud. The implementation is inspired by the PCL implementatio...
Definition: PointCloud.cpp:790
core::Device GetDevice() const override
Returns the device attribute of this PointCloud.
Definition: PointCloud.h:422
void EstimateNormals(const std::optional< int > max_nn=30, const std::optional< double > radius=std::nullopt)
Function to estimate point normals. If the point cloud normals exist, the estimated normals are orien...
Definition: PointCloud.cpp:835
geometry::Image ProjectToDepthImage(int width, int height, const core::Tensor &intrinsics, const core::Tensor &extrinsics=core::Tensor::Eye(4, core::Float32, core::Device("CPU:0")), float depth_scale=1000.0f, float depth_max=3.0f)
Project a point cloud to a depth image.
Definition: PointCloud.cpp:1228
OrientedBoundingBox GetOrientedBoundingBox() const
Create an oriented bounding box from attribute "positions".
Definition: PointCloud.cpp:1499
PointCloud VoxelDownSample(double voxel_size, const std::string &reduction="mean") const
Downsamples a point cloud with a specified voxel size.
Definition: PointCloud.cpp:496
void SetPointPositions(const core::Tensor &value)
Set the value of the "positions" attribute. Convenience function.
Definition: PointCloud.h:167
void SetPointColors(const core::Tensor &value)
Set the value of the "colors" attribute. Convenience function.
Definition: PointCloud.h:173
core::Tensor ClusterDBSCAN(double eps, size_t min_points, bool print_progress=false) const
Cluster PointCloud using the DBSCAN algorithm Ester et al., "A Density-Based Algorithm for Discoverin...
Definition: PointCloud.cpp:1391
core::Tensor ComputeMetrics(const PointCloud &pcd2, std::vector< Metric > metrics={Metric::ChamferDistance}, MetricParameters params=MetricParameters()) const
Definition: PointCloud.cpp:1562
TensorMap point_attr_
Definition: PointCloud.h:793
const core::Tensor & GetPointColors() const
Get the value of the "colors" attribute. Convenience function.
Definition: PointCloud.h:144
AxisAlignedBoundingBox GetAxisAlignedBoundingBox() const
Create an axis-aligned bounding box from attribute "positions".
Definition: PointCloud.cpp:1495
bool IsEmpty() const override
Returns !HasPointPositions().
Definition: PointCloud.h:235
open3d::geometry::PointCloud ToLegacy() const
Convert to a legacy Open3D PointCloud.
Definition: PointCloud.cpp:1312
core::Tensor & GetPointColors()
Get the value of the "colors" attribute. Convenience function.
Definition: PointCloud.h:126
int GaussianSplatGetSHOrder() const
Returns the order of spherical harmonics used for Gaussian Splatting. Returns 0 if f_rest is not pres...
Definition: PointCloud.cpp:1611
PointCloud Append(const PointCloud &other) const
Definition: PointCloud.cpp:306
const core::Tensor & GetPointNormals() const
Get the value of the "normals" attribute. Convenience function.
Definition: PointCloud.h:149
void OrientNormalsToAlignWithDirection(const core::Tensor &orientation_reference=core::Tensor::Init< float >({0, 0, 1}, core::Device("CPU:0")))
Function to orient the normals of a point cloud.
Definition: PointCloud.cpp:929
core::Tensor GetMinBound() const
Returns the min bound for point coordinates.
Definition: PointCloud.cpp:281
int PCAPartition(int max_points)
Definition: PointCloud.cpp:1553
PointCloud RandomDownSample(double sampling_ratio) const
Downsample a pointcloud by selecting random index point and its attributes.
Definition: PointCloud.cpp:579
static PointCloud CreateFromRGBDImage(const RGBDImage &rgbd_image, const core::Tensor &intrinsics, const core::Tensor &extrinsics=core::Tensor::Eye(4, core::Float32, core::Device("CPU:0")), float depth_scale=1000.0f, float depth_max=3.0f, int stride=1, bool with_normals=false)
Factory function to create a point cloud from an RGB-D image and a camera model.
Definition: PointCloud.cpp:1201
static PointCloud CreateFromDepthImage(const Image &depth, const core::Tensor &intrinsics, const core::Tensor &extrinsics=core::Tensor::Eye(4, core::Float32, core::Device("CPU:0")), float depth_scale=1000.0f, float depth_max=3.0f, int stride=1, bool with_normals=false)
Factory function to create a point cloud from a depth image and a camera model.
Definition: PointCloud.cpp:1171
void EstimateColorGradients(const std::optional< int > max_nn=30, const std::optional< double > radius=std::nullopt)
Function to compute point color gradients. If radius is provided, then HybridSearch is used,...
Definition: PointCloud.cpp:996
virtual ~PointCloud() override
Definition: PointCloud.h:104
PointCloud Clone() const
Returns copy of the point cloud on the same device.
Definition: PointCloud.cpp:304
void RemovePointAttr(const std::string &key)
Definition: PointCloud.h:197
std::tuple< PointCloud, core::Tensor > RemoveNonFinitePoints(bool remove_nan=true, bool remove_infinite=true) const
Remove all points from the point cloud that have a nan entry, or infinite value. It also removes the ...
Definition: PointCloud.cpp:708
core::Tensor & GetPointPositions()
Get the value of the "positions" attribute. Convenience function.
Definition: PointCloud.h:123
PointCloud & Transform(const core::Tensor &transformation)
Transforms the PointPositions and PointNormals (if exist) of the PointCloud.
Definition: PointCloud.cpp:352
std::string ToString() const
Text description.
Definition: PointCloud.cpp:255
PointCloud(const core::Device &device=core::Device("CPU:0"))
Definition: PointCloud.cpp:230
core::Tensor GetCenter() const
Returns the center for point coordinates.
Definition: PointCloud.cpp:289
static PointCloud FromLegacy(const open3d::geometry::PointCloud &pcd_legacy, core::Dtype dtype=core::Float32, const core::Device &device=core::Device("CPU:0"))
Create a PointCloud from a legacy Open3D PointCloud.
Definition: PointCloud.cpp:1289
LineSet ExtrudeLinear(const core::Tensor &vector, double scale=1.0, bool capping=true) const
Definition: PointCloud.cpp:1519
PointCloud operator+(const PointCloud &other) const
Definition: PointCloud.h:255
OrientedBoundingEllipsoid GetOrientedBoundingEllipsoid(bool robust=false) const
Create an oriented bounding ellipsoid from attribute "positions".
Definition: PointCloud.cpp:1503
const TensorMap & GetPointAttr() const
Getter for point_attr_ TensorMap. Used in Pybind.
Definition: PointCloud.h:110
std::tuple< TriangleMesh, core::Tensor > HiddenPointRemoval(const core::Tensor &camera_location, double radius) const
This is an implementation of the Hidden Point Removal operator described in Katz et....
Definition: PointCloud.cpp:1365
void OrientNormalsTowardsCameraLocation(const core::Tensor &camera_location=core::Tensor::Zeros({3}, core::Float32, core::Device("CPU:0")))
Function to orient the normals of a point cloud.
Definition: PointCloud.cpp:956
TensorMap & GetPointAttr()
Getter for point_attr_ TensorMap.
Definition: PointCloud.h:113
core::Tensor GetMaxBound() const
Returns the max bound for point coordinates.
Definition: PointCloud.cpp:285
LineSet ExtrudeRotation(double angle, const core::Tensor &axis, int resolution=16, double translation=0.0, bool capping=true) const
Definition: PointCloud.cpp:1509
bool IsGaussianSplat() const
Definition: PointCloud.cpp:1595
void SetPointAttr(const std::string &key, const core::Tensor &value)
Definition: PointCloud.h:158
PointCloud SelectByIndex(const core::Tensor &indices, bool invert=false, bool remove_duplicates=false) const
Select points from input pointcloud, based on indices list into output point cloud.
Definition: PointCloud.cpp:461
PointCloud FarthestPointDownSample(const size_t num_samples, const size_t start_index=0) const
Downsample a pointcloud into output pointcloud with a set of points has farthest distance.
Definition: PointCloud.cpp:604
PointCloud SelectByMask(const core::Tensor &boolean_mask, bool invert=false) const
Select points from input pointcloud, based on boolean mask indices into output point cloud.
Definition: PointCloud.cpp:435
void SetPointNormals(const core::Tensor &value)
Set the value of the "normals" attribute. Convenience function.
Definition: PointCloud.h:179
bool HasPointNormals() const
Definition: PointCloud.h:215
PointCloud & Translate(const core::Tensor &translation, bool relative=true)
Translates the PointPositions of the PointCloud.
Definition: PointCloud.cpp:373
Definition: TensorMap.h:31
std::size_t Erase(const std::string key)
Erase elements for the TensorMap by key value, if the key exists. If the key does not exists,...
Definition: TensorMap.h:92
bool Contains(const std::string &key) const
Definition: TensorMap.h:187
A triangle mesh contains vertices and triangles.
Definition: TriangleMesh.h:97
int width
Definition: FilePCD.cpp:52
int height
Definition: FilePCD.cpp:53
int points
Definition: FilePCD.cpp:54
const Dtype Float32
Definition: Dtype.cpp:42
@ ChamferDistance
Chamfer Distance.
Definition: PinholeCameraIntrinsic.cpp:16
const core::Tensor * indices
Definition: TriangleMesh.cpp:2092