Point Cloud Library (PCL)  1.12.1-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. */
53  OctreePointCloudDensityContainer() : point_counter_(0) {}
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 OctreePointCloudDensityContainer* 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 addPointIndex(index_t) override { point_counter_++; }
80 
81  /** \brief Return point counter.
82  * \return Amount of points
83  */
84  uindex_t
86  {
87  return (point_counter_);
88  }
89 
90  /** \brief Reset leaf node. */
91  void
92  reset() override
93  {
94  point_counter_ = 0;
95  }
96 
97 private:
98  uindex_t point_counter_;
99 };
100 
101 /** \brief @b Octree pointcloud density class
102  * \note This class generate an octrees from a point cloud (zero-copy). Only the amount
103  * of points that fall into the leaf node voxel are stored.
104  * \note The octree pointcloud is initialized with its voxel resolution. Its bounding
105  * box is automatically adjusted or can be predefined.
106  * \tparam PointT type of point used in pointcloud
107  * \ingroup octree
108  * \author Julius Kammerl (julius@kammerl.de)
109  */
110 template <typename PointT,
111  typename LeafContainerT = OctreePointCloudDensityContainer,
112  typename BranchContainerT = OctreeContainerEmpty>
114 : public OctreePointCloud<PointT, LeafContainerT, BranchContainerT> {
115 public:
116  /** \brief OctreePointCloudDensity class constructor.
117  * \param resolution_arg: octree resolution at lowest octree level
118  * */
119  OctreePointCloudDensity(const double resolution_arg)
120  : OctreePointCloud<PointT, LeafContainerT, BranchContainerT>(resolution_arg)
121  {}
122 
123  /** \brief Empty class deconstructor. */
124 
125  ~OctreePointCloudDensity() override = default;
126 
127  /** \brief Get the amount of points within a leaf node voxel which is addressed by a
128  * point
129  * \param[in] point_arg: a point addressing a voxel \return amount of points
130  * that fall within leaf node voxel
131  */
132  uindex_t
133  getVoxelDensityAtPoint(const PointT& point_arg) const
134  {
135  uindex_t point_count = 0;
136 
137  OctreePointCloudDensityContainer* leaf = this->findLeafAtPoint(point_arg);
138 
139  if (leaf)
140  point_count = leaf->getPointCounter();
141 
142  return (point_count);
143  }
144 };
145 } // namespace octree
146 } // namespace pcl
147 
148 // needed since OctreePointCloud is not instantiated with template parameters used above
149 #include <pcl/octree/impl/octree_pointcloud.hpp>
150 
151 #define PCL_INSTANTIATE_OctreePointCloudDensity(T) \
152  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
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.