Open3D (C++ API)  0.19.0
Loading...
Searching...
No Matches
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"
27
28namespace open3d {
29namespace t {
30namespace geometry {
31
32class LineSet;
33
81class PointCloud : public Geometry, public DrawableGeometry {
82public:
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
145 return GetPointAttr("colors");
146 }
147
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, {utility::nullopt, 3});
169 SetPointAttr("positions", value);
170 }
171
173 void SetPointColors(const core::Tensor &value) {
174 core::AssertTensorShape(value, {utility::nullopt, 3});
175 SetPointAttr("colors", value);
176 }
177
179 void SetPointNormals(const core::Tensor &value) {
180 core::AssertTensorShape(value, {utility::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
217public:
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
239
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
278 PointCloud &Transform(const core::Tensor &transformation);
279
285 PointCloud &Translate(const core::Tensor &translation,
286 bool relative = true);
287
293 PointCloud &Scale(double scale, const core::Tensor &center);
294
301 PointCloud &Rotate(const core::Tensor &R, const core::Tensor &center);
302
308
315 PointCloud SelectByMask(const core::Tensor &boolean_mask,
316 bool invert = false) const;
317
327 bool invert = false,
328 bool remove_duplicates = false) const;
329
334 PointCloud VoxelDownSample(double voxel_size,
335 const std::string &reduction = "mean") const;
336
342 PointCloud UniformDownSample(size_t every_k_points) const;
343
349 PointCloud RandomDownSample(double sampling_ratio) const;
350
359 PointCloud FarthestPointDownSample(const size_t num_samples,
360 const size_t start_index = 0) const;
361
369 std::tuple<PointCloud, core::Tensor> RemoveRadiusOutliers(
370 size_t nb_points, double search_radius) const;
371
379 std::tuple<PointCloud, core::Tensor> RemoveStatisticalOutliers(
380 size_t nb_neighbors, double std_ratio) const;
381
386 std::tuple<PointCloud, core::Tensor> RemoveDuplicatedPoints() const;
387
395 std::tuple<PointCloud, core::Tensor> RemoveNonFinitePoints(
396 bool remove_nan = true, bool remove_infinite = true) const;
397
399 core::Device GetDevice() const override { return device_; }
400
416 std::tuple<TriangleMesh, core::Tensor> HiddenPointRemoval(
417 const core::Tensor &camera_location, double radius) const;
418
431 core::Tensor ClusterDBSCAN(double eps,
432 size_t min_points,
433 bool print_progress = false) const;
434
447 std::tuple<core::Tensor, core::Tensor> SegmentPlane(
448 const double distance_threshold = 0.01,
449 const int ransac_n = 3,
450 const int num_iterations = 100,
451 const double probability = 0.99999999) const;
452
467 TriangleMesh ComputeConvexHull(bool joggle_inputs = false) const;
468
479 std::tuple<PointCloud, core::Tensor> ComputeBoundaryPoints(
480 double radius,
481 int max_nn = 30,
482 double angle_threshold = 90.0) const;
483
484public:
487
499 void EstimateNormals(
500 const utility::optional<int> max_nn = 30,
502
508 const core::Tensor &orientation_reference =
509 core::Tensor::Init<float>({0, 0, 1},
510 core::Device("CPU:0")));
511
517 const core::Tensor &camera_location = core::Tensor::Zeros(
518 {3}, core::Float32, core::Device("CPU:0")));
519
533 const double lambda = 0.0,
534 const double cos_alpha_tol = 1.0);
535
550 const utility::optional<int> max_nn = 30,
552
553public:
579 const Image &depth,
580 const core::Tensor &intrinsics,
581 const core::Tensor &extrinsics =
583 float depth_scale = 1000.0f,
584 float depth_max = 3.0f,
585 int stride = 1,
586 bool with_normals = false);
587
614 const RGBDImage &rgbd_image,
615 const core::Tensor &intrinsics,
616 const core::Tensor &extrinsics =
618 float depth_scale = 1000.0f,
619 float depth_max = 3.0f,
620 int stride = 1,
621 bool with_normals = false);
622
624 static PointCloud FromLegacy(
625 const open3d::geometry::PointCloud &pcd_legacy,
627 const core::Device &device = core::Device("CPU:0"));
628
631
634 int width,
635 int height,
636 const core::Tensor &intrinsics,
637 const core::Tensor &extrinsics =
639 float depth_scale = 1000.0f,
640 float depth_max = 3.0f);
641
644 int width,
645 int height,
646 const core::Tensor &intrinsics,
647 const core::Tensor &extrinsics =
649 float depth_scale = 1000.0f,
650 float depth_max = 3.0f);
651
654
657
664 bool invert = false) const;
665
671 PointCloud Crop(const OrientedBoundingBox &obb, bool invert = false) const;
672
681 LineSet ExtrudeRotation(double angle,
682 const core::Tensor &axis,
683 int resolution = 16,
684 double translation = 0.0,
685 bool capping = true) const;
686
692 LineSet ExtrudeLinear(const core::Tensor &vector,
693 double scale = 1.0,
694 bool capping = true) const;
695
701 int PCAPartition(int max_points);
702
714
729
737 const PointCloud &pcd2,
738 std::vector<Metric> metrics = {Metric::ChamferDistance},
739 MetricParameters params = MetricParameters()) const;
740
741protected:
744};
745
746} // namespace geometry
747} // namespace t
748} // namespace open3d
math::float4 color
Definition LineSetBuffers.cpp:45
double t
Definition SurfaceReconstructionPoisson.cpp:172
size_t stride
Definition TriangleMeshBuffers.cpp:165
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:1124
static Tensor Zeros(const SizeVector &shape, Dtype dtype, const Device &device=Device("CPU:0"))
Create a tensor fill with zeros.
Definition Tensor.cpp:374
Device GetDevice() const override
Definition Tensor.cpp:1403
static Tensor Eye(int64_t n, Dtype dtype, const Device &device)
Create an identity matrix of size n x n.
Definition Tensor.cpp:386
A bounding box that is aligned along the coordinate axes and defined by the min_bound and max_bound.
Definition BoundingVolume.h:160
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:29
A bounding box oriented along an arbitrary frame of reference.
Definition BoundingVolume.h:25
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:453
TensorMap & GetPointAttr()
Getter for point_attr_ TensorMap.
Definition PointCloud.h:113
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:557
PointCloud UniformDownSample(size_t every_k_points) const
Downsamples a point cloud by selecting every kth index point and its attributes.
Definition PointCloud.cpp:344
PointCloud & Rotate(const core::Tensor &R, const core::Tensor &center)
Rotates the PointPositions and PointNormals (if exists).
Definition PointCloud.cpp:205
PointCloud & Clear() override
Clear all data in the point cloud.
Definition PointCloud.h:229
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:1186
const core::Tensor & GetPointNormals() const
Get the value of the "normals" attribute. Convenience function.
Definition PointCloud.h:149
PointCloud Crop(const AxisAlignedBoundingBox &aabb, bool invert=false) const
Function to crop pointcloud into output pointcloud.
Definition PointCloud.cpp:1303
TriangleMesh ComputeConvexHull(bool joggle_inputs=false) const
Definition PointCloud.cpp:1208
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:425
std::tuple< PointCloud, core::Tensor > RemoveDuplicatedPoints() const
Remove duplicated points and there associated attributes.
Definition PointCloud.cpp:515
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:1034
core::Tensor & GetPointNormals()
Get the value of the "normals" attribute. Convenience function.
Definition PointCloud.h:129
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:195
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:618
core::Device device_
Definition PointCloud.h:742
PointCloud & NormalizeNormals()
Normalize point normals to length 1.
Definition PointCloud.cpp:537
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:765
PointCloud To(const core::Device &device, bool copy=false) const
Definition PointCloud.cpp:111
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:573
core::Device GetDevice() const override
Returns the device attribute of this PointCloud.
Definition PointCloud.h:399
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:1011
OrientedBoundingBox GetOrientedBoundingBox() const
Create an oriented bounding box from attribute "positions".
Definition PointCloud.cpp:1282
PointCloud VoxelDownSample(double voxel_size, const std::string &reduction="mean") const
Downsamples a point cloud with a specified voxel size.
Definition PointCloud.cpp:279
core::Tensor & GetPointColors()
Get the value of the "colors" attribute. Convenience function.
Definition PointCloud.h:126
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:1174
core::Tensor ComputeMetrics(const PointCloud &pcd2, std::vector< Metric > metrics={Metric::ChamferDistance}, MetricParameters params=MetricParameters()) const
Definition PointCloud.cpp:1339
TensorMap point_attr_
Definition PointCloud.h:743
AxisAlignedBoundingBox GetAxisAlignedBoundingBox() const
Create an axis-aligned bounding box from attribute "positions".
Definition PointCloud.cpp:1278
bool IsEmpty() const override
Returns !HasPointPositions().
Definition PointCloud.h:235
const core::Tensor & GetPointPositions() const
Get the value of the "positions" attribute. Convenience function.
Definition PointCloud.h:139
open3d::geometry::PointCloud ToLegacy() const
Convert to a legacy Open3D PointCloud.
Definition PointCloud.cpp:1095
const core::Tensor & GetPointAttr(const std::string &key) const
Definition PointCloud.h:134
PointCloud Append(const PointCloud &other) const
Definition PointCloud.cpp:124
core::Tensor & GetPointAttr(const std::string &key)
Definition PointCloud.h:118
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:712
core::Tensor GetMinBound() const
Returns the min bound for point coordinates.
Definition PointCloud.cpp:99
int PCAPartition(int max_points)
Definition PointCloud.cpp:1330
PointCloud RandomDownSample(double sampling_ratio) const
Downsample a pointcloud by selecting random index point and its attributes.
Definition PointCloud.cpp:362
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:984
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:954
virtual ~PointCloud() override
Definition PointCloud.h:104
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:779
PointCloud Clone() const
Returns copy of the point cloud on the same device.
Definition PointCloud.cpp:122
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:491
const TensorMap & GetPointAttr() const
Getter for point_attr_ TensorMap. Used in Pybind.
Definition PointCloud.h:110
PointCloud & Transform(const core::Tensor &transformation)
Transforms the PointPositions and PointNormals (if exist) of the PointCloud.
Definition PointCloud.cpp:170
std::string ToString() const
Text description.
Definition PointCloud.cpp:73
core::Tensor GetCenter() const
Returns the center for point coordinates.
Definition PointCloud.cpp:107
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:1072
LineSet ExtrudeLinear(const core::Tensor &vector, double scale=1.0, bool capping=true) const
Definition PointCloud.cpp:1296
PointCloud operator+(const PointCloud &other) const
Definition PointCloud.h:255
const core::Tensor & GetPointColors() const
Get the value of the "colors" attribute. Convenience function.
Definition PointCloud.h:144
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:1148
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:739
core::Tensor GetMaxBound() const
Returns the max bound for point coordinates.
Definition PointCloud.cpp:103
LineSet ExtrudeRotation(double angle, const core::Tensor &axis, int resolution=16, double translation=0.0, bool capping=true) const
Definition PointCloud.cpp:1286
core::Tensor & GetPointPositions()
Get the value of the "positions" attribute. Convenience function.
Definition PointCloud.h:123
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:244
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:387
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:218
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:181
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:96
Definition Optional.h:259
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.
constexpr nullopt_t nullopt
Definition Optional.h:152
Definition PinholeCameraIntrinsic.cpp:16