Open3D (C++ API)  0.17.0
VoxelGrid.h
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - Open3D: www.open3d.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2023 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 
16 #include "open3d/utility/Helper.h"
17 #include "open3d/utility/Logging.h"
18 
19 namespace open3d {
20 
21 namespace camera {
22 class PinholeCameraParameters;
23 }
24 
25 namespace geometry {
26 
27 class PointCloud;
28 class TriangleMesh;
29 class Octree;
30 class Image;
31 
35 class Voxel {
36 public:
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 
51 public:
53  Eigen::Vector3i grid_index_ = Eigen::Vector3i(0, 0, 0);
55  Eigen::Vector3d color_ = Eigen::Vector3d(0, 0, 0);
56 };
57 
61 class VoxelGrid : public Geometry3D {
62 public:
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  std::vector<Eigen::Vector3d> GetVoxelBoundingPoints(
128  const Eigen::Vector3i &index) const;
129 
132  std::vector<bool> CheckIfIncluded(
133  const std::vector<Eigen::Vector3d> &queries);
134 
145  const Image &depth_map,
146  const camera::PinholeCameraParameters &camera_parameter,
147  bool keep_voxels_outside_image);
148 
159  const Image &silhouette_mask,
160  const camera::PinholeCameraParameters &camera_parameter,
161  bool keep_voxels_outside_image);
162 
166  void CreateFromOctree(const Octree &octree);
167 
171  std::shared_ptr<geometry::Octree> ToOctree(const size_t &max_depth) const;
172 
182  static std::shared_ptr<VoxelGrid> CreateDense(const Eigen::Vector3d &origin,
183  const Eigen::Vector3d &color,
184  double voxel_size,
185  double width,
186  double height,
187  double depth);
188 
196  static std::shared_ptr<VoxelGrid> CreateFromPointCloud(
197  const PointCloud &input, double voxel_size);
198 
208  static std::shared_ptr<VoxelGrid> CreateFromPointCloudWithinBounds(
209  const PointCloud &input,
210  double voxel_size,
211  const Eigen::Vector3d &min_bound,
212  const Eigen::Vector3d &max_bound);
213 
220  static std::shared_ptr<VoxelGrid> CreateFromTriangleMesh(
221  const TriangleMesh &input, double voxel_size);
222 
231  static std::shared_ptr<VoxelGrid> CreateFromTriangleMeshWithinBounds(
232  const TriangleMesh &input,
233  double voxel_size,
234  const Eigen::Vector3d &min_bound,
235  const Eigen::Vector3d &max_bound);
236 
240  std::vector<Voxel> GetVoxels() const;
241 
242 public:
244  double voxel_size_ = 0.0;
246  Eigen::Vector3d origin_ = Eigen::Vector3d::Zero();
248  std::unordered_map<Eigen::Vector3i,
249  Voxel,
252 };
253 
259 public:
260  AvgColorVoxel() : num_of_points_(0), color_(0.0, 0.0, 0.0) {}
261 
262 public:
263  void Add(const Eigen::Vector3i &voxel_index) {
264  if (num_of_points_ > 0 && voxel_index != voxel_index_) {
266  "Tried to aggregate ColorVoxel with different "
267  "voxel_index");
268  }
269  voxel_index_ = voxel_index;
270  }
271 
272  void Add(const Eigen::Vector3i &voxel_index, const Eigen::Vector3d &color) {
273  Add(voxel_index);
274  color_ += color;
275  num_of_points_++;
276  }
277 
278  Eigen::Vector3i GetVoxelIndex() const { return voxel_index_; }
279 
280  Eigen::Vector3d GetAverageColor() const {
281  if (num_of_points_ > 0) {
282  return color_ / double(num_of_points_);
283  } else {
284  return color_;
285  }
286  }
287 
288 public:
290  Eigen::Vector3i voxel_index_;
291  Eigen::Vector3d color_;
292 };
293 
294 } // namespace geometry
295 } // namespace open3d
math::float4 color
Definition: LineSetBuffers.cpp:45
#define LogWarning(...)
Definition: Logging.h:60
Contains both intrinsic and extrinsic pinhole camera parameters.
Definition: PinholeCameraParameters.h:21
Class to aggregate color values from different votes in one voxel Computes the average color value in...
Definition: VoxelGrid.h:258
AvgColorVoxel()
Definition: VoxelGrid.h:260
void Add(const Eigen::Vector3i &voxel_index, const Eigen::Vector3d &color)
Definition: VoxelGrid.h:272
Eigen::Vector3d color_
Definition: VoxelGrid.h:291
void Add(const Eigen::Vector3i &voxel_index)
Definition: VoxelGrid.h:263
Eigen::Vector3i GetVoxelIndex() const
Definition: VoxelGrid.h:278
int num_of_points_
Definition: VoxelGrid.h:289
Eigen::Vector3i voxel_index_
Definition: VoxelGrid.h:290
Eigen::Vector3d GetAverageColor() const
Definition: VoxelGrid.h:280
A bounding box that is aligned along the coordinate axes.
Definition: BoundingVolume.h:159
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:156
AxisAlignedBoundingBox GetAxisAlignedBoundingBox() const override
Definition: VoxelGrid.cpp:81
void CreateFromOctree(const Octree &octree)
Definition: VoxelGrid.cpp:213
VoxelGrid & CarveSilhouette(const Image &silhouette_mask, const camera::PinholeCameraParameters &camera_parameter, bool keep_voxels_outside_image)
Definition: VoxelGrid.cpp:303
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:251
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_
Coorindate of the origin point.
Definition: VoxelGrid.h:246
VoxelGrid & Clear() override
Clear all elements in the geometry.
Definition: VoxelGrid.cpp:29
static std::shared_ptr< VoxelGrid > CreateFromPointCloudWithinBounds(const PointCloud &input, double voxel_size, const Eigen::Vector3d &min_bound, const Eigen::Vector3d &max_bound)
Definition: VoxelGridFactory.cpp:44
VoxelGrid & CarveDepthMap(const Image &depth_map, const camera::PinholeCameraParameters &camera_parameter, bool keep_voxels_outside_image)
Definition: VoxelGrid.cpp:259
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:200
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:99
Eigen::Vector3d GetCenter() const override
Returns the center of the geometry coordinates.
Definition: VoxelGrid.cpp:65
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:347
double voxel_size_
Size of the voxel.
Definition: VoxelGrid.h:244
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
VoxelGrid & operator+=(const VoxelGrid &voxelgrid)
Definition: VoxelGrid.cpp:120
static std::shared_ptr< VoxelGrid > CreateFromPointCloud(const PointCloud &input, double voxel_size)
Definition: VoxelGridFactory.cpp:90
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:252
~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: PinholeCameraIntrinsic.cpp:16
Definition: Helper.h:71