Point Cloud Library (PCL)  1.8.1
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 #ifndef PCL_OCTREE_DENSITY_H
40 #define PCL_OCTREE_DENSITY_H
41 
42 #include <pcl/octree/octree_pointcloud.h>
43 
44 namespace pcl
45 {
46  namespace octree
47  {
48  /** \brief @b Octree pointcloud density leaf node class
49  * \note This class implements a leaf node that counts the amount of points which fall into its voxel space.
50  * \author Julius Kammerl (julius@kammerl.de)
51  */
53  {
54  public:
55  /** \brief Class initialization. */
56  OctreePointCloudDensityContainer () : point_counter_ (0)
57  {
58  }
59 
60  /** \brief Empty class deconstructor. */
62  {
63  }
64 
65  /** \brief deep copy function */
67  deepCopy () const
68  {
69  return (new OctreePointCloudDensityContainer (*this));
70  }
71 
72  /** \brief Equal comparison operator
73  * \param[in] other OctreePointCloudDensityContainer to compare with
74  */
75  virtual bool operator==(const OctreeContainerBase& other) const
76  {
77  const OctreePointCloudDensityContainer* otherContainer =
78  dynamic_cast<const OctreePointCloudDensityContainer*>(&other);
79 
80  return (this->point_counter_==otherContainer->point_counter_);
81  }
82 
83  /** \brief Read input data. Only an internal counter is increased.
84  */
85  void
87  {
88  point_counter_++;
89  }
90 
91  /** \brief Return point counter.
92  * \return Amount of points
93  */
94  unsigned int
96  {
97  return (point_counter_);
98  }
99 
100  /** \brief Reset leaf node. */
101  virtual void
102  reset ()
103  {
104  point_counter_ = 0;
105  }
106 
107  private:
108  unsigned int point_counter_;
109 
110  };
111 
112  /** \brief @b Octree pointcloud density class
113  * \note This class generate an octrees from a point cloud (zero-copy). Only the amount of points that fall into the leaf node voxel are stored.
114  * \note The octree pointcloud is initialized with its voxel resolution. Its bounding box is automatically adjusted or can be predefined.
115  * \note
116  * \note typename: PointT: type of point used in pointcloud
117  * \ingroup octree
118  * \author Julius Kammerl (julius@kammerl.de)
119  */
120  template<typename PointT, typename LeafContainerT = OctreePointCloudDensityContainer, typename BranchContainerT = OctreeContainerEmpty >
121  class OctreePointCloudDensity : public OctreePointCloud<PointT, LeafContainerT, BranchContainerT>
122  {
123  public:
124 
125  /** \brief OctreePointCloudDensity class constructor.
126  * \param resolution_arg: octree resolution at lowest octree level
127  * */
128  OctreePointCloudDensity (const double resolution_arg) :
129  OctreePointCloud<PointT, LeafContainerT, BranchContainerT> (resolution_arg)
130  {
131  }
132 
133  /** \brief Empty class deconstructor. */
134  virtual
136  {
137  }
138 
139  /** \brief Get the amount of points within a leaf node voxel which is addressed by a point
140  * \param[in] point_arg: a point addressing a voxel
141  * \return amount of points that fall within leaf node voxel
142  */
143  unsigned int
144  getVoxelDensityAtPoint (const PointT& point_arg) const
145  {
146  unsigned int point_count = 0;
147 
148  OctreePointCloudDensityContainer* leaf = this->findLeafAtPoint (point_arg);
149 
150  if (leaf)
151  point_count = leaf->getPointCounter ();
152 
153  return (point_count);
154  }
155  };
156  }
157 }
158 
159 #define PCL_INSTANTIATE_OctreePointCloudDensity(T) template class PCL_EXPORTS pcl::octree::OctreePointCloudDensity<T>;
160 
161 #endif
162 
Octree container class that can serve as a base to construct own leaf node container classes...
Octree pointcloud class
virtual ~OctreePointCloudDensity()
Empty class deconstructor.
OctreePointCloudDensity(const double resolution_arg)
OctreePointCloudDensity class constructor.
Octree pointcloud density leaf node class
virtual OctreePointCloudDensityContainer * deepCopy() const
deep copy function
unsigned int getVoxelDensityAtPoint(const PointT &point_arg) const
Get the amount of points within a leaf node voxel which is addressed by a point.
virtual ~OctreePointCloudDensityContainer()
Empty class deconstructor.
unsigned int getPointCounter()
Return point counter.
virtual bool operator==(const OctreeContainerBase &other) const
Equal comparison operator.
A point structure representing Euclidean xyz coordinates, and the RGB color.