Open3D (C++ API)  0.19.0
Loading...
Searching...
No Matches
VoxelGrid.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 <Eigen/Core>
11#include <memory>
12#include <unordered_map>
13#include <vector>
14
18
19namespace open3d {
20
21namespace camera {
22class PinholeCameraParameters;
23}
24
25namespace geometry {
26
27class PointCloud;
28class TriangleMesh;
29class Octree;
30class Image;
31
35class Voxel {
36public:
38 Voxel() {}
42 Voxel(const Eigen::Vector3i &grid_index) : grid_index_(grid_index) {}
47 Voxel(const Eigen::Vector3i &grid_index, const Eigen::Vector3d &color)
48 : grid_index_(grid_index), color_(color) {}
49 ~Voxel() {}
50
51public:
53 Eigen::Vector3i grid_index_ = Eigen::Vector3i(0, 0, 0);
55 Eigen::Vector3d color_ = Eigen::Vector3d(0, 0, 0);
56};
57
61class VoxelGrid : public Geometry3D {
62public:
66 VoxelGrid(const VoxelGrid &src_voxel_grid);
67 ~VoxelGrid() override {}
68
69 VoxelGrid &Clear() override;
70 bool IsEmpty() const override;
71 Eigen::Vector3d GetMinBound() const override;
72 Eigen::Vector3d GetMaxBound() const override;
73 Eigen::Vector3d GetCenter() const override;
74
78
82 bool robust = false) const override;
83
87 bool robust = false) const override;
88
89 VoxelGrid &Transform(const Eigen::Matrix4d &transformation) override;
90 VoxelGrid &Translate(const Eigen::Vector3d &translation,
91 bool relative = true) override;
92 VoxelGrid &Scale(const double scale,
93 const Eigen::Vector3d &center) override;
94 VoxelGrid &Rotate(const Eigen::Matrix3d &R,
95 const Eigen::Vector3d &center) override;
96
97 VoxelGrid &operator+=(const VoxelGrid &voxelgrid);
98 VoxelGrid operator+(const VoxelGrid &voxelgrid) const;
99
101 bool HasVoxels() const { return voxels_.size() > 0; }
103 bool HasColors() const {
104 return true; // By default, the colors are (0, 0, 0)
105 }
107 Eigen::Vector3i GetVoxel(const Eigen::Vector3d &point) const;
108
110 Eigen::Vector3d GetVoxelCenterCoordinate(const Eigen::Vector3i &idx) const {
111 auto it = voxels_.find(idx);
112 if (it != voxels_.end()) {
113 auto voxel = it->second;
114 return ((voxel.grid_index_.cast<double>() +
115 Eigen::Vector3d(0.5, 0.5, 0.5)) *
116 voxel_size_) +
117 origin_;
118 } else {
119 return Eigen::Vector3d::Zero();
120 }
121 }
122
124 void AddVoxel(const Voxel &voxel);
125
127 void RemoveVoxel(const Eigen::Vector3i &idx);
128
130 std::vector<Eigen::Vector3d> GetVoxelBoundingPoints(
131 const Eigen::Vector3i &index) const;
132
135 std::vector<bool> CheckIfIncluded(
136 const std::vector<Eigen::Vector3d> &queries);
137
148 const Image &depth_map,
149 const camera::PinholeCameraParameters &camera_parameter,
150 bool keep_voxels_outside_image);
151
162 const Image &silhouette_mask,
163 const camera::PinholeCameraParameters &camera_parameter,
164 bool keep_voxels_outside_image);
165
169 void CreateFromOctree(const Octree &octree);
170
174 std::shared_ptr<geometry::Octree> ToOctree(const size_t &max_depth) const;
175
185 static std::shared_ptr<VoxelGrid> CreateDense(const Eigen::Vector3d &origin,
186 const Eigen::Vector3d &color,
187 double voxel_size,
188 double width,
189 double height,
190 double depth);
191
195 enum class VoxelPoolingMode { AVG, MIN, MAX, SUM };
196
206 static std::shared_ptr<VoxelGrid> CreateFromPointCloud(
207 const PointCloud &input,
208 double voxel_size,
210
222 static std::shared_ptr<VoxelGrid> CreateFromPointCloudWithinBounds(
223 const PointCloud &input,
224 double voxel_size,
225 const Eigen::Vector3d &min_bound,
226 const Eigen::Vector3d &max_bound,
228
235 static std::shared_ptr<VoxelGrid> CreateFromTriangleMesh(
236 const TriangleMesh &input, double voxel_size);
237
246 static std::shared_ptr<VoxelGrid> CreateFromTriangleMeshWithinBounds(
247 const TriangleMesh &input,
248 double voxel_size,
249 const Eigen::Vector3d &min_bound,
250 const Eigen::Vector3d &max_bound);
251
255 std::vector<Voxel> GetVoxels() const;
256
257public:
259 double voxel_size_ = 0.0;
261 Eigen::Vector3d origin_ = Eigen::Vector3d::Zero();
263 std::unordered_map<Eigen::Vector3i,
264 Voxel,
267};
268
274public:
275 AvgColorVoxel() : num_of_points_(0), color_(0.0, 0.0, 0.0) {}
276
277public:
278 void Add(const Eigen::Vector3i &voxel_index) {
279 if (num_of_points_ > 0 && voxel_index != voxel_index_) {
280 utility::LogWarning(
281 "Tried to aggregate ColorVoxel with different "
282 "voxel_index");
283 }
284 voxel_index_ = voxel_index;
285 }
286
287 void Add(const Eigen::Vector3i &voxel_index, const Eigen::Vector3d &color) {
288 Add(voxel_index);
289 color_ += color;
291 }
292
293 Eigen::Vector3i GetVoxelIndex() const { return voxel_index_; }
294
295 Eigen::Vector3d GetAverageColor() const {
296 if (num_of_points_ > 0) {
297 return color_ / double(num_of_points_);
298 } else {
299 return color_;
300 }
301 }
302
303public:
305 Eigen::Vector3i voxel_index_;
306 Eigen::Vector3d color_;
307};
308
314public:
316 : num_of_points_(0),
317 color_(0.0, 0.0, 0.0),
318 min_color_(Eigen::Vector3d::Constant(
319 std::numeric_limits<double>::max())),
320 max_color_(Eigen::Vector3d::Constant(
321 std::numeric_limits<double>::lowest())) {}
322
323public:
324 void Add(const Eigen::Vector3i &voxel_index) {
325 if (num_of_points_ > 0 && voxel_index != voxel_index_) {
326 utility::LogWarning(
327 "Tried to aggregate ColorVoxel with different "
328 "voxel_index");
329 }
330 voxel_index_ = voxel_index;
331 }
332
333 void Add(const Eigen::Vector3i &voxel_index, const Eigen::Vector3d &color) {
334 Add(voxel_index);
335 color_ += color;
337 min_color_ = min_color_.cwiseMin(color);
338 max_color_ = max_color_.cwiseMax(color);
339 }
340
341 Eigen::Vector3i GetVoxelIndex() const { return voxel_index_; }
342
343 Eigen::Vector3d GetAverageColor() const {
344 if (num_of_points_ > 0) {
345 return color_ / double(num_of_points_);
346 } else {
347 return color_;
348 }
349 }
350
351 Eigen::Vector3d GetMinColor() const { return min_color_; }
352
353 Eigen::Vector3d GetMaxColor() const { return max_color_; }
354
355 Eigen::Vector3d GetSumColor() const { return color_; }
356
357public:
359 Eigen::Vector3i voxel_index_;
360 Eigen::Vector3d color_;
361
362private:
363 Eigen::Vector3d min_color_;
364 Eigen::Vector3d max_color_;
365};
366
367} // namespace geometry
368} // namespace open3d
math::float4 color
Definition LineSetBuffers.cpp:45
Point< Real, 3 > point
Definition SurfaceReconstructionPoisson.cpp:163
Contains both intrinsic and extrinsic pinhole camera parameters.
Definition PinholeCameraParameters.h:21
Class to aggregate color values from different votes in one voxel Can be used to compute min,...
Definition VoxelGrid.h:313
Eigen::Vector3d color_
Definition VoxelGrid.h:360
void Add(const Eigen::Vector3i &voxel_index, const Eigen::Vector3d &color)
Definition VoxelGrid.h:333
AggColorVoxel()
Definition VoxelGrid.h:315
Eigen::Vector3d GetMaxColor() const
Definition VoxelGrid.h:353
Eigen::Vector3i GetVoxelIndex() const
Definition VoxelGrid.h:341
Eigen::Vector3i voxel_index_
Definition VoxelGrid.h:359
Eigen::Vector3d GetSumColor() const
Definition VoxelGrid.h:355
void Add(const Eigen::Vector3i &voxel_index)
Definition VoxelGrid.h:324
Eigen::Vector3d GetAverageColor() const
Definition VoxelGrid.h:343
int num_of_points_
Definition VoxelGrid.h:358
Eigen::Vector3d GetMinColor() const
Definition VoxelGrid.h:351
Class to aggregate color values from different votes in one voxel Computes the average color value in...
Definition VoxelGrid.h:273
AvgColorVoxel()
Definition VoxelGrid.h:275
void Add(const Eigen::Vector3i &voxel_index, const Eigen::Vector3d &color)
Definition VoxelGrid.h:287
Eigen::Vector3d color_
Definition VoxelGrid.h:306
void Add(const Eigen::Vector3i &voxel_index)
Definition VoxelGrid.h:278
Eigen::Vector3i GetVoxelIndex() const
Definition VoxelGrid.h:293
int num_of_points_
Definition VoxelGrid.h:304
Eigen::Vector3i voxel_index_
Definition VoxelGrid.h:305
Eigen::Vector3d GetAverageColor() const
Definition VoxelGrid.h:295
A bounding box that is aligned along the coordinate axes and defined by the min_bound and max_bound.
Definition BoundingVolume.h:160
The base geometry class for 3D geometries.
Definition Geometry3D.h:28
The base geometry class.
Definition Geometry.h:18
GeometryType
Specifies possible geometry types.
Definition Geometry.h:23
The Image class stores image with customizable width, height, num of channels and bytes per channel.
Definition Image.h:34
Octree datastructure.
Definition Octree.h:244
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
Triangle mesh contains vertices and triangles represented by the indices to the vertices.
Definition TriangleMesh.h:35
VoxelGrid is a collection of voxels which are aligned in grid.
Definition VoxelGrid.h:61
static std::shared_ptr< VoxelGrid > CreateFromTriangleMesh(const TriangleMesh &input, double voxel_size)
Definition VoxelGridFactory.cpp:166
AxisAlignedBoundingBox GetAxisAlignedBoundingBox() const override
Definition VoxelGrid.cpp:81
void CreateFromOctree(const Octree &octree)
Definition VoxelGrid.cpp:215
VoxelGrid & CarveSilhouette(const Image &silhouette_mask, const camera::PinholeCameraParameters &camera_parameter, bool keep_voxels_outside_image)
Definition VoxelGrid.cpp:305
VoxelPoolingMode
Possible ways of determining voxel color from PointCloud.
Definition VoxelGrid.h:195
VoxelGrid operator+(const VoxelGrid &voxelgrid) const
Definition VoxelGrid.cpp:171
std::vector< Eigen::Vector3d > GetVoxelBoundingPoints(const Eigen::Vector3i &index) const
Return a vector of 3D coordinates that define the indexed voxel cube.
Definition VoxelGrid.cpp:180
VoxelGrid()
Default Constructor.
Definition VoxelGrid.h:64
VoxelGrid & Rotate(const Eigen::Matrix3d &R, const Eigen::Vector3d &center) override
Apply rotation to the geometry coordinates and normals. Given a rotation matrix , and center ,...
Definition VoxelGrid.cpp:114
OrientedBoundingBox GetOrientedBoundingBox(bool robust=false) const override
Definition VoxelGrid.cpp:88
std::unordered_map< Eigen::Vector3i, Voxel, utility::hash_eigen< Eigen::Vector3i > > voxels_
Voxels contained in voxel grid.
Definition VoxelGrid.h:266
bool IsEmpty() const override
Returns true iff the geometry is empty.
Definition VoxelGrid.cpp:36
Eigen::Vector3d GetVoxelCenterCoordinate(const Eigen::Vector3i &idx) const
Function that returns the 3d coordinates of the queried voxel center.
Definition VoxelGrid.h:110
Eigen::Vector3d origin_
Coordinate of the origin point.
Definition VoxelGrid.h:261
VoxelGrid & Clear() override
Clear all elements in the geometry.
Definition VoxelGrid.cpp:29
VoxelGrid & CarveDepthMap(const Image &depth_map, const camera::PinholeCameraParameters &camera_parameter, bool keep_voxels_outside_image)
Definition VoxelGrid.cpp:261
VoxelGrid & Scale(const double scale, const Eigen::Vector3d &center) override
Apply scaling to the geometry coordinates. Given a scaling factor , and center , a given point is tr...
Definition VoxelGrid.cpp:109
Eigen::Vector3d GetMinBound() const override
Returns min bounds for geometry coordinates.
Definition VoxelGrid.cpp:38
bool HasVoxels() const
Returns true if the voxel grid contains voxels.
Definition VoxelGrid.h:101
std::vector< bool > CheckIfIncluded(const std::vector< Eigen::Vector3d > &queries)
Definition VoxelGrid.cpp:202
VoxelGrid & Transform(const Eigen::Matrix4d &transformation) override
Apply transformation (4x4 matrix) to the geometry coordinates.
Definition VoxelGrid.cpp:98
bool HasColors() const
Returns true if the voxel grid contains voxel colors.
Definition VoxelGrid.h:103
Eigen::Vector3d GetMaxBound() const override
Returns max bounds for geometry coordinates.
Definition VoxelGrid.cpp:51
static std::shared_ptr< VoxelGrid > CreateFromTriangleMeshWithinBounds(const TriangleMesh &input, double voxel_size, const Eigen::Vector3d &min_bound, const Eigen::Vector3d &max_bound)
Definition VoxelGridFactory.cpp:108
Eigen::Vector3d GetCenter() const override
Returns the center of the geometry coordinates.
Definition VoxelGrid.cpp:65
static std::shared_ptr< VoxelGrid > CreateFromPointCloudWithinBounds(const PointCloud &input, double voxel_size, const Eigen::Vector3d &min_bound, const Eigen::Vector3d &max_bound, VoxelPoolingMode color_mode=VoxelPoolingMode::AVG)
Definition VoxelGridFactory.cpp:44
void AddVoxel(const Voxel &voxel)
Add a voxel with specified grid index and color.
Definition VoxelGrid.cpp:196
VoxelGrid & Translate(const Eigen::Vector3d &translation, bool relative=true) override
Apply translation to the geometry coordinates.
Definition VoxelGrid.cpp:103
std::vector< Voxel > GetVoxels() const
Definition VoxelGrid.cpp:349
double voxel_size_
Size of the voxel.
Definition VoxelGrid.h:259
static std::shared_ptr< VoxelGrid > CreateDense(const Eigen::Vector3d &origin, const Eigen::Vector3d &color, double voxel_size, double width, double height, double depth)
Definition VoxelGridFactory.cpp:21
static std::shared_ptr< VoxelGrid > CreateFromPointCloud(const PointCloud &input, double voxel_size, VoxelPoolingMode color_mode=VoxelPoolingMode::AVG)
Definition VoxelGridFactory.cpp:97
void RemoveVoxel(const Eigen::Vector3i &idx)
Remove a voxel with specified grid index.
Definition VoxelGrid.cpp:200
VoxelGrid & operator+=(const VoxelGrid &voxelgrid)
Definition VoxelGrid.cpp:120
Eigen::Vector3i GetVoxel(const Eigen::Vector3d &point) const
Returns voxel index given query point.
Definition VoxelGrid.cpp:175
OrientedBoundingBox GetMinimalOrientedBoundingBox(bool robust=false) const override
Definition VoxelGrid.cpp:93
std::shared_ptr< geometry::Octree > ToOctree(const size_t &max_depth) const
Definition VoxelGrid.cpp:254
~VoxelGrid() override
Definition VoxelGrid.h:67
Base Voxel class, containing grid id and color.
Definition VoxelGrid.h:35
~Voxel()
Definition VoxelGrid.h:49
Eigen::Vector3i grid_index_
Grid coordinate index of the voxel.
Definition VoxelGrid.h:53
Voxel(const Eigen::Vector3i &grid_index, const Eigen::Vector3d &color)
Parameterized Constructor.
Definition VoxelGrid.h:47
Eigen::Vector3d color_
Color of the voxel.
Definition VoxelGrid.h:55
Voxel(const Eigen::Vector3i &grid_index)
Parameterized Constructor.
Definition VoxelGrid.h:42
Voxel()
Default Constructor.
Definition VoxelGrid.h:38
int width
Definition FilePCD.cpp:52
int height
Definition FilePCD.cpp:53
Definition NonRigidOptimizer.cpp:22
Definition PinholeCameraIntrinsic.cpp:16
Definition Device.h:111
Definition Helper.h:71