Point Cloud Library (PCL)  1.14.0-dev
octree_pointcloud_density.h
1 /*
2  * Software License Agreement (BSD License)
3  *
4  * Point Cloud Library (PCL) - www.pointclouds.org
5  * Copyright (c) 2010-2011, Willow Garage, Inc.
6  *
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  *
13  * * Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  * * Redistributions in binary form must reproduce the above
16  * copyright notice, this list of conditions and the following
17  * disclaimer in the documentation and/or other materials provided
18  * with the distribution.
19  * * Neither the name of Willow Garage, Inc. nor the names of its
20  * contributors may be used to endorse or promote products derived
21  * from this software without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
29  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
33  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34  * POSSIBILITY OF SUCH DAMAGE.
35  *
36  * $Id$
37  */
38 
39 #pragma once
40 
41 #include <pcl/octree/octree_pointcloud.h>
42 
43 namespace pcl {
44 namespace octree {
45 /** \brief @b Octree pointcloud density leaf node class
46  * \note This class implements a leaf node that counts the amount of points which fall
47  * into its voxel space.
48  * \author Julius Kammerl (julius@kammerl.de)
49  */
51 public:
52  /** \brief Class initialization. */
54 
55  /** \brief Empty class deconstructor. */
56  ~OctreePointCloudDensityContainer() override = default;
57 
58  /** \brief deep copy function */
60  deepCopy() const
61  {
62  return (new OctreePointCloudDensityContainer(*this));
63  }
64 
65  /** \brief Equal comparison operator
66  * \param[in] other OctreePointCloudDensityContainer to compare with
67  */
68  bool
69  operator==(const OctreeContainerBase& other) const override
70  {
71  const auto* otherContainer =
72  dynamic_cast<const OctreePointCloudDensityContainer*>(&other);
73 
74  return (this->point_counter_ == otherContainer->point_counter_);
75  }
76 
77  /** \brief Read input data. Only an internal counter is increased.
78  */
79  void
81  {
82  point_counter_++;
83  }
84 
85  /** \brief Return point counter.
86  * \return Amount of points
87  */
88  uindex_t
90  {
91  return (point_counter_);
92  }
93 
94  /** \brief Reset leaf node. */
95  void
96  reset() override
97  {
98  point_counter_ = 0;
99  }
100 
101 private:
102  uindex_t point_counter_{0};
103 };
104 
105 /** \brief @b Octree pointcloud density class
106  * \note This class generate an octrees from a point cloud (zero-copy). Only the amount
107  * of points that fall into the leaf node voxel are stored.
108  * \note The octree pointcloud is initialized with its voxel resolution. Its bounding
109  * box is automatically adjusted or can be predefined.
110  * \tparam PointT type of point used in pointcloud
111  * \ingroup octree
112  * \author Julius Kammerl (julius@kammerl.de)
113  */
114 template <typename PointT,
115  typename LeafContainerT = OctreePointCloudDensityContainer,
116  typename BranchContainerT = OctreeContainerEmpty>
118 : public OctreePointCloud<PointT, LeafContainerT, BranchContainerT> {
119 public:
120  /** \brief OctreePointCloudDensity class constructor.
121  * \param resolution_arg: octree resolution at lowest octree level
122  * */
123  OctreePointCloudDensity(const double resolution_arg)
124  : OctreePointCloud<PointT, LeafContainerT, BranchContainerT>(resolution_arg)
125  {}
126 
127  /** \brief Empty class deconstructor. */
128 
129  ~OctreePointCloudDensity() override = default;
130 
131  /** \brief Get the amount of points within a leaf node voxel which is addressed by a
132  * point
133  * \param[in] point_arg: a point addressing a voxel \return amount of points
134  * that fall within leaf node voxel
135  */
136  uindex_t
137  getVoxelDensityAtPoint(const PointT& point_arg) const
138  {
139  uindex_t point_count = 0;
140 
141  OctreePointCloudDensityContainer* leaf = this->findLeafAtPoint(point_arg);
142 
143  if (leaf)
144  point_count = leaf->getPointCounter();
145 
146  return (point_count);
147  }
148 };
149 } // namespace octree
150 } // namespace pcl
151 
152 // needed since OctreePointCloud is not instantiated with template parameters used above
153 #include <pcl/octree/impl/octree_pointcloud.hpp>
154 
155 #define PCL_INSTANTIATE_OctreePointCloudDensity(T) \
156  template class PCL_EXPORTS pcl::octree::OctreePointCloudDensity<T>;
Octree container class that can serve as a base to construct own leaf node container classes.
Octree pointcloud density leaf node class
bool operator==(const OctreeContainerBase &other) const override
Equal comparison operator.
virtual OctreePointCloudDensityContainer * deepCopy() const
deep copy function
OctreePointCloudDensityContainer()=default
Class initialization.
void addPointIndex(index_t) override
Read input data.
~OctreePointCloudDensityContainer() override=default
Empty class deconstructor.
~OctreePointCloudDensity() override=default
Empty class deconstructor.
OctreePointCloudDensity(const double resolution_arg)
OctreePointCloudDensity class constructor.
uindex_t getVoxelDensityAtPoint(const PointT &point_arg) const
Get the amount of points within a leaf node voxel which is addressed by a point.
Octree pointcloud class
OctreePointCloudDensityContainer * findLeafAtPoint(const PointT &point_arg) const
Find octree leaf node at a given point.
detail::int_type_t< detail::index_type_size, false > uindex_t
Type used for an unsigned index in PCL.
Definition: types.h:120
detail::int_type_t< detail::index_type_size, detail::index_type_signed > index_t
Type used for an index in PCL.
Definition: types.h:112
A point structure representing Euclidean xyz coordinates, and the RGB color.