Point Cloud Library (PCL) 1.13.0
Loading...
Searching...
No Matches
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
43namespace pcl {
44namespace 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 */
51public:
52 /** \brief Class initialization. */
53 OctreePointCloudDensityContainer() : point_counter_(0) {}
54
55 /** \brief Empty class deconstructor. */
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 */
90 {
91 return (point_counter_);
92 }
93
94 /** \brief Reset leaf node. */
95 void
96 reset() override
97 {
98 point_counter_ = 0;
99 }
100
101private:
102 uindex_t point_counter_;
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 */
114template <typename PointT,
115 typename LeafContainerT = OctreePointCloudDensityContainer,
116 typename BranchContainerT = OctreeContainerEmpty>
118: public OctreePointCloud<PointT, LeafContainerT, BranchContainerT> {
119public:
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 */
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
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
LeafContainerT * 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.