ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
PointCloud.h
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 #pragma once
9 
10 #include <Logging.h>
11 
12 #include <initializer_list>
13 #include <string>
14 #include <unordered_map>
15 #include <unordered_set>
16 
28 
29 namespace cloudViewer {
30 namespace t {
31 namespace geometry {
32 
33 class LineSet;
34 
82 class PointCloud : public Geometry, public DrawableGeometry {
83 public:
87  PointCloud(const core::Device &device = core::Device("CPU:0"));
88 
96 
102  PointCloud(const std::unordered_map<std::string, core::Tensor>
103  &map_keys_to_tensors);
104 
105  virtual ~PointCloud() override {}
106 
108  std::string ToString() const;
109 
111  const TensorMap &GetPointAttr() const { return point_attr_; }
112 
115 
119  core::Tensor &GetPointAttr(const std::string &key) {
120  return point_attr_.at(key);
121  }
122 
124  core::Tensor &GetPointPositions() { return GetPointAttr("positions"); }
125 
127  core::Tensor &GetPointColors() { return GetPointAttr("colors"); }
128 
130  core::Tensor &GetPointNormals() { return GetPointAttr("normals"); }
131 
135  const core::Tensor &GetPointAttr(const std::string &key) const {
136  return point_attr_.at(key);
137  }
138 
141  return GetPointAttr("positions");
142  }
143 
144  // ---------------------------------------------------------------------
145  // Backward-compatibility helpers for pre-v0.19 API
146  // ---------------------------------------------------------------------
150 
152  const core::Tensor &GetPoints() const { return GetPointPositions(); }
153 
156  void SetPoints(const core::Tensor &value) { SetPointPositions(value); }
157 
160  bool HasPoints() const { return HasPointPositions(); }
161 
163  const core::Tensor &GetPointColors() const {
164  return GetPointAttr("colors");
165  }
166 
168  const core::Tensor &GetPointNormals() const {
169  return GetPointAttr("normals");
170  }
171 
177  void SetPointAttr(const std::string &key, const core::Tensor &value) {
178  if (value.GetDevice() != device_) {
179  utility::LogError("Attribute device {} != Pointcloud's device {}.",
180  value.GetDevice().ToString(), device_.ToString());
181  }
182  point_attr_[key] = value;
183  }
184 
186  void SetPointPositions(const core::Tensor &value) {
188  SetPointAttr("positions", value);
189  }
190 
192  void SetPointColors(const core::Tensor &value) {
194  SetPointAttr("colors", value);
195  }
196 
198  void SetPointNormals(const core::Tensor &value) {
200  SetPointAttr("normals", value);
201  }
202 
207  bool HasPointAttr(const std::string &key) const {
208  return point_attr_.Contains(key) && GetPointAttr(key).GetLength() > 0 &&
209  GetPointAttr(key).GetLength() == GetPointPositions().GetLength();
210  }
211 
216  void RemovePointAttr(const std::string &key) { point_attr_.Erase(key); }
217 
220  bool HasPointPositions() const { return HasPointAttr("positions"); }
221 
227  bool HasPointColors() const { return HasPointAttr("colors"); }
228 
234  bool HasPointNormals() const { return HasPointAttr("normals"); }
235 
236 public:
242  PointCloud To(const core::Device &device, bool copy = false) const;
243 
245  PointCloud CPU() const { return To(core::Device("CPU:0"), false); }
246 
248  PointCloud Clone() const;
249 
251  PointCloud &Clear() override {
252  point_attr_.clear();
253  return *this;
254  }
255 
257  bool IsEmpty() const override { return !HasPointPositions(); }
258 
260  core::Tensor GetMinBound() const;
261 
263  core::Tensor GetMaxBound() const;
264 
266  core::Tensor GetCenter() const;
267 
273  PointCloud Append(const PointCloud &other) const;
274 
277  PointCloud operator+(const PointCloud &other) const {
278  return Append(other);
279  }
280 
300  PointCloud &Transform(const core::Tensor &transformation);
301 
307  PointCloud &Translate(const core::Tensor &translation,
308  bool relative = true);
309 
315  PointCloud &Scale(double scale, const core::Tensor &center);
316 
323  PointCloud &Rotate(const core::Tensor &R, const core::Tensor &center);
324 
330 
337  PointCloud SelectByMask(const core::Tensor &boolean_mask,
338  bool invert = false) const;
339 
348  PointCloud SelectByIndex(const core::Tensor &indices,
349  bool invert = false,
350  bool remove_duplicates = false) const;
351 
356  PointCloud VoxelDownSample(double voxel_size,
357  const std::string &reduction = "mean") const;
358 
364  PointCloud UniformDownSample(size_t every_k_points) const;
365 
371  PointCloud RandomDownSample(double sampling_ratio) const;
372 
381  PointCloud FarthestPointDownSample(const size_t num_samples,
382  const size_t start_index = 0) const;
383 
391  std::tuple<PointCloud, core::Tensor> RemoveRadiusOutliers(
392  size_t nb_points, double search_radius) const;
393 
401  std::tuple<PointCloud, core::Tensor> RemoveStatisticalOutliers(
402  size_t nb_neighbors, double std_ratio) const;
403 
408  std::tuple<PointCloud, core::Tensor> RemoveDuplicatedPoints() const;
409 
417  std::tuple<PointCloud, core::Tensor> RemoveNonFinitePoints(
418  bool remove_nan = true, bool remove_infinite = true) const;
419 
421  core::Device GetDevice() const override { return device_; }
422 
438  std::tuple<TriangleMesh, core::Tensor> HiddenPointRemoval(
439  const core::Tensor &camera_location, double radius) const;
440 
453  core::Tensor ClusterDBSCAN(double eps,
454  size_t min_points,
455  bool print_progress = false) const;
456 
469  std::tuple<core::Tensor, core::Tensor> SegmentPlane(
470  const double distance_threshold = 0.01,
471  const int ransac_n = 3,
472  const int num_iterations = 100,
473  const double probability = 0.99999999) const;
474 
489  TriangleMesh ComputeConvexHull(bool joggle_inputs = false) const;
490 
501  std::tuple<PointCloud, core::Tensor> ComputeBoundaryPoints(
502  double radius,
503  int max_nn = 30,
504  double angle_threshold = 90.0) const;
505 
506 public:
509 
521  void EstimateNormals(
522  const utility::optional<int> max_nn = 30,
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 utility::optional<int> max_nn = 30,
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 cloudViewer::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 
675  AxisAlignedBoundingBox GetAxisAlignedBoundingBox() const;
676 
679 
685  PointCloud Crop(const AxisAlignedBoundingBox &aabb,
686  bool invert = false) const;
687 
693  PointCloud Crop(const OrientedBoundingBox &obb, bool invert = false) const;
694 
703  LineSet ExtrudeRotation(double angle,
704  const core::Tensor &axis,
705  int resolution = 16,
706  double translation = 0.0,
707  bool capping = true) const;
708 
714  LineSet ExtrudeLinear(const core::Tensor &vector,
715  double scale = 1.0,
716  bool capping = true) const;
717 
723  int PCAPartition(int max_points);
724 
736 
751 
759  const PointCloud &pcd2,
760  std::vector<Metric> metrics = {Metric::ChamferDistance},
761  MetricParameters params = MetricParameters()) const;
762 
769  bool IsGaussianSplat() const;
770 
775  int GaussianSplatGetSHOrder() const;
776 
777 protected:
780 };
781 
782 } // namespace geometry
783 } // namespace t
784 } // namespace cloudViewer
int width
int height
int points
math::float4 color
cmdLineReadable * params[]
#define AssertTensorShape(tensor,...)
Definition: TensorCheck.h:61
size_t stride
bool copy
Definition: VtkUtils.cpp:74
A 3D cloud and its associated features (color, normals, scalar fields, etc.)
A bounding box oriented along an arbitrary frame of reference.
std::string ToString() const
Returns string representation of device, e.g. "CPU:0", "CUDA:0".
Definition: Device.cpp:89
int64_t GetLength() const
Definition: Tensor.h:1125
static Tensor Eye(int64_t n, Dtype dtype, const Device &device)
Create an identity matrix of size n x n.
Definition: Tensor.cpp:418
static Tensor Zeros(const SizeVector &shape, Dtype dtype, const Device &device=Device("CPU:0"))
Create a tensor fill with zeros.
Definition: Tensor.cpp:406
Device GetDevice() const override
Definition: Tensor.cpp:1435
The Image class stores image with customizable width, height, num of channels and bytes per channel.
Definition: Image.h:33
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.
The base geometry class.
Definition: Geometry.h:23
A point cloud contains a list of 3D points.
Definition: PointCloud.h:82
void SetPointNormals(const core::Tensor &value)
Set the value of the "normals" attribute. Convenience function.
Definition: PointCloud.h:198
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:713
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:492
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...
void SetPoints(const core::Tensor &value)
Definition: PointCloud.h:156
core::Tensor GetCenter() const
Returns the center for point coordinates.
Definition: PointCloud.cpp:108
int GaussianSplatGetSHOrder() const
Returns the order of spherical harmonics used for Gaussian Splatting. Returns 0 if f_rest is not pres...
core::Tensor & GetPointAttr(const std::string &key)
Definition: PointCloud.h:119
const core::Tensor & GetPointColors() const
Get the value of the "colors" attribute. Convenience function.
Definition: PointCloud.h:163
PointCloud & NormalizeNormals()
Normalize point normals to length 1.
Definition: PointCloud.cpp:538
PointCloud & Rotate(const core::Tensor &R, const core::Tensor &center)
Rotates the PointPositions and PointNormals (if exists).
Definition: PointCloud.cpp:206
core::Tensor & GetPointNormals()
Get the value of the "normals" attribute. Convenience function.
Definition: PointCloud.h:130
PointCloud VoxelDownSample(double voxel_size, const std::string &reduction="mean") const
Downsamples a point cloud with a specified voxel size.
Definition: PointCloud.cpp:280
PointCloud Crop(const AxisAlignedBoundingBox &aabb, bool invert=false) const
Function to crop pointcloud into output pointcloud.
PointCloud operator+(const PointCloud &other) const
Definition: PointCloud.h:277
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:388
void SetPointColors(const core::Tensor &value)
Set the value of the "colors" attribute. Convenience function.
Definition: PointCloud.h:192
bool HasPointAttr(const std::string &key) const
Definition: PointCloud.h:207
const core::Tensor & GetPointNormals() const
Get the value of the "normals" attribute. Convenience function.
Definition: PointCloud.h:168
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:245
const core::Tensor & GetPointAttr(const std::string &key) const
Definition: PointCloud.h:135
core::Tensor GetMaxBound() const
Returns the max bound for point coordinates.
Definition: PointCloud.cpp:104
TriangleMesh ComputeConvexHull(bool joggle_inputs=false) const
static PointCloud FromLegacy(const cloudViewer::geometry::PointCloud &pcd_legacy, core::Dtype dtype=core::Float32, const core::Device &device=core::Device("CPU:0"))
Create a PointCloud from a legacy CloudViewer PointCloud.
PointCloud RandomDownSample(double sampling_ratio) const
Downsample a pointcloud by selecting random index point and its attributes.
Definition: PointCloud.cpp:363
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....
OrientedBoundingBox GetOrientedBoundingBox() const
Create an oriented bounding box from attribute "positions".
void EstimateNormals(const utility::optional< int > max_nn=30, const utility::optional< double > radius=utility::nullopt)
Function to estimate point normals. If the point cloud normals exist, the estimated normals are orien...
Definition: PointCloud.cpp:619
void SetPointPositions(const core::Tensor &value)
Set the value of the "positions" attribute. Convenience function.
Definition: PointCloud.h:186
const core::Tensor & GetPoints() const
Backward-compatible const getter for point positions.
Definition: PointCloud.h:152
TensorMap & GetPointAttr()
Getter for point_attr_ TensorMap.
Definition: PointCloud.h:114
core::Tensor GetMinBound() const
Returns the min bound for point coordinates.
Definition: PointCloud.cpp:100
std::string ToString() const
Text description.
Definition: PointCloud.cpp:74
core::Tensor & GetPointPositions()
Get the value of the "positions" attribute. Convenience function.
Definition: PointCloud.h:124
LineSet ExtrudeRotation(double angle, const core::Tensor &axis, int resolution=16, double translation=0.0, bool capping=true) const
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:740
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:454
bool IsEmpty() const override
Returns !HasPointPositions().
Definition: PointCloud.h:257
PointCloud To(const core::Device &device, bool copy=false) const
Definition: PointCloud.cpp:112
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:219
PointCloud UniformDownSample(size_t every_k_points) const
Downsamples a point cloud by selecting every kth index point and its attributes.
Definition: PointCloud.cpp:345
AxisAlignedBoundingBox GetAxisAlignedBoundingBox() const
Create an axis-aligned bounding box from attribute "positions".
void EstimateColorGradients(const utility::optional< int > max_nn=30, const utility::optional< double > radius=utility::nullopt)
Function to compute point color gradients. If radius is provided, then HybridSearch is used,...
Definition: PointCloud.cpp:781
PointCloud & PaintUniformColor(const core::Tensor &color)
Assigns uniform color to the point cloud.
Definition: PointCloud.cpp:558
cloudViewer::geometry::PointCloud ToLegacy() const
Convert to a legacy CloudViewer PointCloud.
core::Device GetDevice() const override
Returns the device attribute of this PointCloud.
Definition: PointCloud.h:421
PointCloud CPU() const
Backward-compatible convenience method to obtain a CPU-resident copy.
Definition: PointCloud.h:245
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:956
LineSet ExtrudeLinear(const core::Tensor &vector, double scale=1.0, bool capping=true) const
const core::Tensor & GetPointPositions() const
Get the value of the "positions" attribute. Convenience function.
Definition: PointCloud.h:140
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:574
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.
void RemovePointAttr(const std::string &key)
Definition: PointCloud.h:216
PointCloud & Translate(const core::Tensor &translation, bool relative=true)
Translates the PointPositions of the PointCloud.
Definition: PointCloud.cpp:182
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.
PointCloud Clone() const
Returns copy of the point cloud on the same device.
Definition: PointCloud.cpp:123
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:426
std::tuple< PointCloud, core::Tensor > RemoveDuplicatedPoints() const
Remove duplicated points and there associated attributes.
Definition: PointCloud.cpp:516
const TensorMap & GetPointAttr() const
Getter for point_attr_ TensorMap. Used in Pybind.
Definition: PointCloud.h:111
core::Tensor ComputeMetrics(const PointCloud &pcd2, std::vector< Metric > metrics={Metric::ChamferDistance}, MetricParameters params=MetricParameters()) const
PointCloud & Scale(double scale, const core::Tensor &center)
Scales the PointPositions of the PointCloud.
Definition: PointCloud.cpp:196
PointCloud & Clear() override
Clear all data in the point cloud.
Definition: PointCloud.h:251
PointCloud Append(const PointCloud &other) const
Definition: PointCloud.cpp:125
void SetPointAttr(const std::string &key, const core::Tensor &value)
Definition: PointCloud.h:177
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...
core::Tensor & GetPointColors()
Get the value of the "colors" attribute. Convenience function.
Definition: PointCloud.h:127
PointCloud(const core::Device &device=core::Device("CPU:0"))
Definition: PointCloud.cpp:49
PointCloud & Transform(const core::Tensor &transformation)
Transforms the PointPositions and PointNormals (if exist) of the PointCloud.
Definition: PointCloud.cpp:171
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:766
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:986
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:98
#define LogError(...)
Definition: Logging.h:60
const Dtype Float32
Definition: Dtype.cpp:42
@ ChamferDistance
Chamfer Distance.
constexpr nullopt_t nullopt
Definition: Optional.h:136
Generic file read and write utility for python interface.