Point Cloud Library (PCL) 1.12.1
pcl_base.hpp
1/*
2 * Software License Agreement (BSD License)
3 *
4 * Point Cloud Library (PCL) - www.pointclouds.org
5 * Copyright (c) 2012-, Open Perception, 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 the copyright holder(s) 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 */
37#ifndef PCL_PCL_IMPL_BASE_HPP_
38#define PCL_PCL_IMPL_BASE_HPP_
39
40#include <pcl/pcl_base.h>
41#include <pcl/console/print.h>
42#include <cstddef>
43
44///////////////////////////////////////////////////////////////////////////////////////////
45template <typename PointT>
47 : input_ ()
48 , use_indices_ (false)
49 , fake_indices_ (false)
50{
51}
52
53///////////////////////////////////////////////////////////////////////////////////////////
54template <typename PointT>
56 : input_ (base.input_)
57 , indices_ (base.indices_)
58 , use_indices_ (base.use_indices_)
59 , fake_indices_ (base.fake_indices_)
60{
61}
62
63///////////////////////////////////////////////////////////////////////////////////////////
64template <typename PointT> void
66{
67 input_ = cloud;
68}
69
70///////////////////////////////////////////////////////////////////////////////////////////
71template <typename PointT> void
73{
74 indices_ = indices;
75 fake_indices_ = false;
76 use_indices_ = true;
77}
78
79///////////////////////////////////////////////////////////////////////////////////////////
80template <typename PointT> void
82{
83 indices_.reset (new Indices (*indices));
84 fake_indices_ = false;
85 use_indices_ = true;
86}
87
88///////////////////////////////////////////////////////////////////////////////////////////
89template <typename PointT> void
91{
92 indices_.reset (new Indices (indices->indices));
93 fake_indices_ = false;
94 use_indices_ = true;
95}
96
97///////////////////////////////////////////////////////////////////////////////////////////
98template <typename PointT> void
99pcl::PCLBase<PointT>::setIndices (std::size_t row_start, std::size_t col_start, std::size_t nb_rows, std::size_t nb_cols)
100{
101 if ((nb_rows > input_->height) || (row_start > input_->height))
103 PCL_ERROR ("[PCLBase::setIndices] cloud is only %d height\n", input_->height);
104 return;
105 }
106
107 if ((nb_cols > input_->width) || (col_start > input_->width))
109 PCL_ERROR ("[PCLBase::setIndices] cloud is only %d width\n", input_->width);
110 return;
111 }
112
113 std::size_t row_end = row_start + nb_rows;
114 if (row_end > input_->height)
115 {
116 PCL_ERROR ("[PCLBase::setIndices] %d is out of rows range %d\n", row_end, input_->height);
117 return;
118 }
119
120 std::size_t col_end = col_start + nb_cols;
121 if (col_end > input_->width)
122 {
123 PCL_ERROR ("[PCLBase::setIndices] %d is out of columns range %d\n", col_end, input_->width);
124 return;
126
127 indices_.reset (new Indices);
128 indices_->reserve (nb_cols * nb_rows);
129 for(std::size_t i = row_start; i < row_end; i++)
130 for(std::size_t j = col_start; j < col_end; j++)
131 indices_->push_back (static_cast<int> ((i * input_->width) + j));
132 fake_indices_ = false;
133 use_indices_ = true;
134}
135
136///////////////////////////////////////////////////////////////////////////////////////////
137template <typename PointT> bool
139{
140 // Check if input was set
141 if (!input_)
142 {
143 PCL_ERROR ("[initCompute] No input set.\n");
144 return (false);
145 }
146
147 // If no point indices have been given, construct a set of indices for the entire input point cloud
148 if (!indices_)
149 {
150 fake_indices_ = true;
151 indices_.reset (new Indices);
152 }
153
154 // If we have a set of fake indices, but they do not match the number of points in the cloud, update them
155 if (fake_indices_ && indices_->size () != input_->size ())
156 {
157 const auto indices_size = indices_->size ();
158 try
159 {
160 indices_->resize (input_->size ());
161 }
162 catch (const std::bad_alloc&)
163 {
164 PCL_ERROR ("[initCompute] Failed to allocate %lu indices.\n", input_->size ());
165 }
166 for (auto i = indices_size; i < indices_->size (); ++i) { (*indices_)[i] = static_cast<int>(i); }
167 }
169 return (true);
170}
171
172///////////////////////////////////////////////////////////////////////////////////////////
173template <typename PointT> bool
175{
176 return (true);
177}
178
179#define PCL_INSTANTIATE_PCLBase(T) template class PCL_EXPORTS pcl::PCLBase<T>;
180
181#endif //#ifndef PCL_PCL_IMPL_BASE_HPP_
182
PCL base class.
Definition: pcl_base.h:70
virtual void setInputCloud(const PointCloudConstPtr &cloud)
Provide a pointer to the input dataset.
Definition: pcl_base.hpp:65
typename PointCloud::ConstPtr PointCloudConstPtr
Definition: pcl_base.h:74
virtual void setIndices(const IndicesPtr &indices)
Provide a pointer to the vector of indices that represents the input data.
Definition: pcl_base.hpp:72
bool initCompute()
This method should get called before starting the actual computation.
Definition: pcl_base.hpp:138
PointIndices::ConstPtr PointIndicesConstPtr
Definition: pcl_base.h:77
PCLBase()
Empty constructor.
Definition: pcl_base.hpp:46
bool deinitCompute()
This method should get called after finishing the actual computation.
Definition: pcl_base.hpp:174
shared_ptr< const Indices > IndicesConstPtr
Definition: pcl_base.h:59
IndicesAllocator<> Indices
Type used for indices in PCL.
Definition: types.h:133
shared_ptr< Indices > IndicesPtr
Definition: pcl_base.h:58