Open3D (C++ API)
VoxelGrid.h
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - Open3D: www.open3d.org -
3 // ----------------------------------------------------------------------------
4 // The MIT License (MIT)
5 //
6 // Copyright (c) 2018 www.open3d.org
7 //
8 // Permission is hereby granted, free of charge, to any person obtaining a copy
9 // of this software and associated documentation files (the "Software"), to deal
10 // in the Software without restriction, including without limitation the rights
11 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 // copies of the Software, and to permit persons to whom the Software is
13 // furnished to do so, subject to the following conditions:
14 //
15 // The above copyright notice and this permission notice shall be included in
16 // all copies or substantial portions of the Software.
17 //
18 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
24 // IN THE SOFTWARE.
25 // ----------------------------------------------------------------------------
26 
27 #pragma once
28 
29 #include <Eigen/Core>
30 #include <memory>
31 #include <unordered_map>
32 #include <vector>
33 
35 #include "Open3D/Utility/Console.h"
36 
37 #include "Open3D/Utility/Helper.h"
38 
39 namespace open3d {
40 
41 namespace camera {
42 class PinholeCameraParameters;
43 }
44 
45 namespace geometry {
46 
47 class PointCloud;
48 class TriangleMesh;
49 class Octree;
50 class Image;
51 
55 class Voxel {
56 public:
58  Voxel() {}
62  Voxel(const Eigen::Vector3i &grid_index) : grid_index_(grid_index) {}
67  Voxel(const Eigen::Vector3i &grid_index, const Eigen::Vector3d &color)
68  : grid_index_(grid_index), color_(color) {}
69  ~Voxel() {}
70 
71 public:
73  Eigen::Vector3i grid_index_ = Eigen::Vector3i(0, 0, 0);
75  Eigen::Vector3d color_ = Eigen::Vector3d(0, 0, 0);
76 };
77 
81 class VoxelGrid : public Geometry3D {
82 public:
86  VoxelGrid(const VoxelGrid &src_voxel_grid);
87  ~VoxelGrid() override {}
88 
89  VoxelGrid &Clear() override;
90  bool IsEmpty() const override;
91  Eigen::Vector3d GetMinBound() const override;
92  Eigen::Vector3d GetMaxBound() const override;
93  Eigen::Vector3d GetCenter() const override;
94  AxisAlignedBoundingBox GetAxisAlignedBoundingBox() const override;
95  OrientedBoundingBox GetOrientedBoundingBox() const override;
96  VoxelGrid &Transform(const Eigen::Matrix4d &transformation) override;
97  VoxelGrid &Translate(const Eigen::Vector3d &translation,
98  bool relative = true) override;
99  VoxelGrid &Scale(const double scale,
100  const Eigen::Vector3d &center) override;
101  VoxelGrid &Rotate(const Eigen::Matrix3d &R,
102  const Eigen::Vector3d &center) override;
103 
104  VoxelGrid &operator+=(const VoxelGrid &voxelgrid);
105  VoxelGrid operator+(const VoxelGrid &voxelgrid) const;
106 
108  bool HasVoxels() const { return voxels_.size() > 0; }
110  bool HasColors() const {
111  return true; // By default, the colors are (0, 0, 0)
112  }
114  Eigen::Vector3i GetVoxel(const Eigen::Vector3d &point) const;
115 
117  Eigen::Vector3d GetVoxelCenterCoordinate(const Eigen::Vector3i &idx) const {
118  auto it = voxels_.find(idx);
119  if (it != voxels_.end()) {
120  auto voxel = it->second;
121  return ((voxel.grid_index_.cast<double>() +
122  Eigen::Vector3d(0.5, 0.5, 0.5)) *
123  voxel_size_) +
124  origin_;
125  } else {
126  return Eigen::Vector3d::Zero();
127  }
128  }
129 
131  void AddVoxel(const Voxel &voxel);
132 
134  std::vector<Eigen::Vector3d> GetVoxelBoundingPoints(
135  const Eigen::Vector3i &index) const;
136 
139  std::vector<bool> CheckIfIncluded(
140  const std::vector<Eigen::Vector3d> &queries);
141 
151  VoxelGrid &CarveDepthMap(
152  const Image &depth_map,
153  const camera::PinholeCameraParameters &camera_parameter,
154  bool keep_voxels_outside_image);
155 
165  VoxelGrid &CarveSilhouette(
166  const Image &silhouette_mask,
167  const camera::PinholeCameraParameters &camera_parameter,
168  bool keep_voxels_outside_image);
169 
173  void CreateFromOctree(const Octree &octree);
174 
178  std::shared_ptr<geometry::Octree> ToOctree(const size_t &max_depth) const;
179 
188  static std::shared_ptr<VoxelGrid> CreateDense(const Eigen::Vector3d &origin,
189  double voxel_size,
190  double width,
191  double height,
192  double depth);
193 
201  static std::shared_ptr<VoxelGrid> CreateFromPointCloud(
202  const PointCloud &input, double voxel_size);
203 
213  static std::shared_ptr<VoxelGrid> CreateFromPointCloudWithinBounds(
214  const PointCloud &input,
215  double voxel_size,
216  const Eigen::Vector3d &min_bound,
217  const Eigen::Vector3d &max_bound);
218 
225  static std::shared_ptr<VoxelGrid> CreateFromTriangleMesh(
226  const TriangleMesh &input, double voxel_size);
227 
236  static std::shared_ptr<VoxelGrid> CreateFromTriangleMeshWithinBounds(
237  const TriangleMesh &input,
238  double voxel_size,
239  const Eigen::Vector3d &min_bound,
240  const Eigen::Vector3d &max_bound);
241 
245  std::vector<Voxel> GetVoxels() const;
246 
247 public:
249  double voxel_size_ = 0.0;
251  Eigen::Vector3d origin_ = Eigen::Vector3d::Zero();
253  std::unordered_map<Eigen::Vector3i,
254  Voxel,
257 };
258 
264 public:
265  AvgColorVoxel() : num_of_points_(0), color_(0.0, 0.0, 0.0) {}
266 
267 public:
268  void Add(const Eigen::Vector3i &voxel_index) {
269  if (num_of_points_ > 0 && voxel_index != voxel_index_) {
271  "Tried to aggregate ColorVoxel with different "
272  "voxel_index");
273  }
274  voxel_index_ = voxel_index;
275  }
276 
277  void Add(const Eigen::Vector3i &voxel_index, const Eigen::Vector3d &color) {
278  Add(voxel_index);
279  color_ += color;
280  num_of_points_++;
281  }
282 
283  Eigen::Vector3i GetVoxelIndex() const { return voxel_index_; }
284 
285  Eigen::Vector3d GetAverageColor() const {
286  if (num_of_points_ > 0) {
287  return color_ / double(num_of_points_);
288  } else {
289  return color_;
290  }
291  }
292 
293 public:
295  Eigen::Vector3i voxel_index_;
296  Eigen::Vector3d color_;
297 };
298 
299 } // namespace geometry
300 } // namespace open3d
Definition: Helper.h:92
The base geometry class.
Definition: Geometry.h:37
void Add(const Eigen::Vector3i &voxel_index)
Definition: VoxelGrid.h:268
A bounding box that is aligned along the coordinate axes.
Definition: BoundingVolume.h:164
void Add(const Eigen::Vector3i &voxel_index, const Eigen::Vector3d &color)
Definition: VoxelGrid.h:277
Voxel(const Eigen::Vector3i &grid_index)
Parameterized Constructor.
Definition: VoxelGrid.h:62
void LogWarning(const char *format, const Args &... args)
Definition: Console.h:179
Eigen::Vector3d color_
Definition: VoxelGrid.h:296
A bounding box oriented along an arbitrary frame of reference.
Definition: BoundingVolume.h:44
Eigen::Vector3i voxel_index_
Definition: VoxelGrid.h:295
A point cloud consists of point coordinates, and optionally point colors and point normals...
Definition: PointCloud.h:54
Eigen::Vector3d GetVoxelCenterCoordinate(const Eigen::Vector3i &idx) const
Function that returns the 3d coordinates of the queried voxel center.
Definition: VoxelGrid.h:117
long voxel_index
Definition: FilePLY.cpp:287
bool HasVoxels() const
Returns true if the voxel grid contains voxels.
Definition: VoxelGrid.h:108
VoxelGrid()
Default Constructor.
Definition: VoxelGrid.h:84
int num_of_points_
Definition: PointCloud.cpp:237
~VoxelGrid() override
Definition: VoxelGrid.h:87
math::float4 color
Definition: LineSetBuffers.cpp:46
double voxel_size
Definition: FilePLY.cpp:286
Tensor operator+(T scalar_lhs, const Tensor &rhs)
Definition: Tensor.h:876
AvgColorVoxel()
Definition: VoxelGrid.h:265
The base geometry class for 3D geometries.
Definition: Geometry3D.h:46
Class to aggregate color values from different votes in one voxel Computes the average color value in...
Definition: VoxelGrid.h:263
~Voxel()
Definition: VoxelGrid.h:69
bool HasColors() const
Returns true if the voxel grid contains voxel colors.
Definition: VoxelGrid.h:110
Contains both intrinsic and extrinsic pinhole camera parameters.
Definition: PinholeCameraParameters.h:40
Eigen::Vector3d origin
Definition: FilePLY.cpp:285
Definition: Open3DViewer.h:29
VoxelGrid is a collection of voxels which are aligned in grid.
Definition: VoxelGrid.h:81
GeometryType
Specifies possible geometry types.
Definition: Geometry.h:42
int height
Definition: FilePCD.cpp:70
Eigen::Vector3d GetAverageColor() const
Definition: VoxelGrid.h:285
Octree datastructure.
Definition: Octree.h:181
Eigen::Vector3d color_
Definition: PointCloud.cpp:240
int num_of_points_
Definition: VoxelGrid.h:294
Base Voxel class, containing grid id and color.
Definition: VoxelGrid.h:55
Eigen::Vector3i GetVoxelIndex() const
Definition: VoxelGrid.h:283
Voxel()
Default Constructor.
Definition: VoxelGrid.h:58
Triangle mesh contains vertices and triangles represented by the indices to the vertices.
Definition: TriangleMesh.h:54
Voxel(const Eigen::Vector3i &grid_index, const Eigen::Vector3d &color)
Parameterized Constructor.
Definition: VoxelGrid.h:67
The Image class stores image with customizable width, height, num of channels and bytes per channel...
Definition: Image.h:53
std::unordered_map< Eigen::Vector3i, Voxel, utility::hash_eigen::hash< Eigen::Vector3i > > voxels_
Voxels contained in voxel grid.
Definition: VoxelGrid.h:256
int width
Definition: FilePCD.cpp:69