Point Cloud Library (PCL) 1.12.0
Loading...
Searching...
No Matches
correspondence_estimation_backprojection.h
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 * $Id$
37 *
38 */
39
40#pragma once
41
42#include <pcl/registration/correspondence_estimation.h>
43#include <pcl/registration/correspondence_types.h>
44
45namespace pcl {
46namespace registration {
47/** \brief @b CorrespondenceEstimationBackprojection computes
48 * correspondences as points in the target cloud which have minimum
49 * \author Suat Gedikli
50 * \ingroup registration
51 */
52template <typename PointSource,
53 typename PointTarget,
54 typename NormalT,
55 typename Scalar = float>
57: public CorrespondenceEstimationBase<PointSource, PointTarget, Scalar> {
58public:
59 using Ptr = shared_ptr<CorrespondenceEstimationBackProjection<PointSource,
60 PointTarget,
61 NormalT,
62 Scalar>>;
63 using ConstPtr = shared_ptr<const CorrespondenceEstimationBackProjection<PointSource,
64 PointTarget,
65 NormalT,
66 Scalar>>;
67
68 using CorrespondenceEstimationBase<PointSource, PointTarget, Scalar>::initCompute;
69 using CorrespondenceEstimationBase<PointSource, PointTarget, Scalar>::
71 using CorrespondenceEstimationBase<PointSource, PointTarget, Scalar>::
73 using PCLBase<PointSource>::deinitCompute;
74 using PCLBase<PointSource>::input_;
75 using PCLBase<PointSource>::indices_;
76 using CorrespondenceEstimationBase<PointSource, PointTarget, Scalar>::getClassName;
77 using CorrespondenceEstimationBase<PointSource, PointTarget, Scalar>::
79 using CorrespondenceEstimationBase<PointSource, PointTarget, Scalar>::target_indices_;
80
82 using KdTreePtr = typename KdTree::Ptr;
83
87
91
95
96 /** \brief Empty constructor.
97 *
98 * \note
99 * Sets the number of neighbors to be considered in the target point cloud (k_) to 10.
100 */
102 : source_normals_(), source_normals_transformed_(), target_normals_(), k_(10)
103 {
104 corr_name_ = "CorrespondenceEstimationBackProjection";
105 }
106
107 /** \brief Empty destructor */
109
110 /** \brief Set the normals computed on the source point cloud
111 * \param[in] normals the normals computed for the source cloud
112 */
113 inline void
115 {
116 source_normals_ = normals;
117 }
118
119 /** \brief Get the normals of the source point cloud
120 */
121 inline NormalsConstPtr
123 {
124 return (source_normals_);
125 }
126
127 /** \brief Set the normals computed on the target point cloud
128 * \param[in] normals the normals computed for the target cloud
129 */
130 inline void
132 {
133 target_normals_ = normals;
134 }
135
136 /** \brief Get the normals of the target point cloud
137 */
138 inline NormalsConstPtr
140 {
141 return (target_normals_);
142 }
143
144 /** \brief See if this rejector requires source normals */
145 bool
147 {
148 return (true);
149 }
150
151 /** \brief Blob method for setting the source normals */
152 void
154 {
155 NormalsPtr cloud(new PointCloudNormals);
156 fromPCLPointCloud2(*cloud2, *cloud);
157 setSourceNormals(cloud);
158 }
159
160 /** \brief See if this rejector requires target normals*/
161 bool
163 {
164 return (true);
165 }
166
167 /** \brief Method for setting the target normals */
168 void
170 {
171 NormalsPtr cloud(new PointCloudNormals);
172 fromPCLPointCloud2(*cloud2, *cloud);
173 setTargetNormals(cloud);
174 }
175
176 /** \brief Determine the correspondences between input and target cloud.
177 * \param[out] correspondences the found correspondences (index of query point, index
178 * of target point, distance) \param[in] max_distance maximum distance between the
179 * normal on the source point cloud and the corresponding point in the target point
180 * cloud
181 */
182 void
184 double max_distance = std::numeric_limits<double>::max());
185
186 /** \brief Determine the reciprocal correspondences between input and target cloud.
187 * A correspondence is considered reciprocal if both Src_i has Tgt_i as a
188 * correspondence, and Tgt_i has Src_i as one.
189 *
190 * \param[out] correspondences the found correspondences (index of query and target
191 * point, distance) \param[in] max_distance maximum allowed distance between
192 * correspondences
193 */
194 virtual void
196 pcl::Correspondences& correspondences,
197 double max_distance = std::numeric_limits<double>::max());
198
199 /** \brief Set the number of nearest neighbours to be considered in the target
200 * point cloud. By default, we use k = 10 nearest neighbors.
201 *
202 * \param[in] k the number of nearest neighbours to be considered
203 */
204 inline void
205 setKSearch(unsigned int k)
206 {
207 k_ = k;
208 }
209
210 /** \brief Get the number of nearest neighbours considered in the target point
211 * cloud for computing correspondences. By default we use k = 10 nearest
212 * neighbors.
213 */
214 inline unsigned int
216 {
217 return (k_);
218 }
219
220 /** \brief Clone and cast to CorrespondenceEstimationBase */
222 clone() const
223 {
224 Ptr copy(new CorrespondenceEstimationBackProjection<PointSource,
225 PointTarget,
226 NormalT,
227 Scalar>(*this));
228 return (copy);
229 }
230
231protected:
232 using CorrespondenceEstimationBase<PointSource, PointTarget, Scalar>::corr_name_;
233 using CorrespondenceEstimationBase<PointSource, PointTarget, Scalar>::tree_;
234 using CorrespondenceEstimationBase<PointSource, PointTarget, Scalar>::
236 using CorrespondenceEstimationBase<PointSource, PointTarget, Scalar>::target_;
237
238 /** \brief Internal computation initialization. */
239 bool
240 initCompute();
241
242private:
243 /** \brief The normals computed at each point in the source cloud */
244 NormalsConstPtr source_normals_;
245
246 /** \brief The normals computed at each point in the source cloud */
247 NormalsPtr source_normals_transformed_;
248
249 /** \brief The normals computed at each point in the target cloud */
250 NormalsConstPtr target_normals_;
251
252 /** \brief The number of neighbours to be considered in the target point cloud */
253 unsigned int k_;
254};
255} // namespace registration
256} // namespace pcl
257
258#include <pcl/registration/impl/correspondence_estimation_backprojection.hpp>
PCL base class.
Definition pcl_base.h:70
PointCloudConstPtr input_
The input point cloud dataset.
Definition pcl_base.h:147
IndicesPtr indices_
A pointer to the vector of point indices to use.
Definition pcl_base.h:150
bool deinitCompute()
This method should get called after finishing the actual computation.
Definition pcl_base.hpp:174
shared_ptr< PointCloud< PointSource > > Ptr
shared_ptr< const PointCloud< PointSource > > ConstPtr
CorrespondenceEstimationBackprojection computes correspondences as points in the target cloud which h...
void setSourceNormals(const NormalsConstPtr &normals)
Set the normals computed on the source point cloud.
void setTargetNormals(pcl::PCLPointCloud2::ConstPtr cloud2)
Method for setting the target normals.
bool requiresTargetNormals() const
See if this rejector requires target normals.
shared_ptr< CorrespondenceEstimationBackProjection< PointSource, PointTarget, NormalT, Scalar > > Ptr
void setSourceNormals(pcl::PCLPointCloud2::ConstPtr cloud2)
Blob method for setting the source normals.
virtual CorrespondenceEstimationBase< PointSource, PointTarget, Scalar >::Ptr clone() const
Clone and cast to CorrespondenceEstimationBase.
NormalsConstPtr getSourceNormals() const
Get the normals of the source point cloud.
void setKSearch(unsigned int k)
Set the number of nearest neighbours to be considered in the target point cloud.
unsigned int getKSearch() const
Get the number of nearest neighbours considered in the target point cloud for computing correspondenc...
NormalsConstPtr getTargetNormals() const
Get the normals of the target point cloud.
virtual void determineReciprocalCorrespondences(pcl::Correspondences &correspondences, double max_distance=std::numeric_limits< double >::max())
Determine the reciprocal correspondences between input and target cloud.
bool requiresSourceNormals() const
See if this rejector requires source normals.
shared_ptr< const CorrespondenceEstimationBackProjection< PointSource, PointTarget, NormalT, Scalar > > ConstPtr
void determineCorrespondences(pcl::Correspondences &correspondences, double max_distance=std::numeric_limits< double >::max())
Determine the correspondences between input and target cloud.
void setTargetNormals(const NormalsConstPtr &normals)
Set the normals computed on the target point cloud.
Abstract CorrespondenceEstimationBase class.
PointCloudTargetPtr input_transformed_
The transformed input source point cloud dataset.
PointCloudTargetConstPtr target_
The input point cloud dataset target.
PointRepresentationConstPtr point_representation_
The point representation used (internal).
std::string corr_name_
The correspondence estimation method name.
const std::string & getClassName() const
Abstract class get name method.
KdTreePtr tree_
A pointer to the spatial search object used for the target dataset.
KdTreeReciprocalPtr tree_reciprocal_
A pointer to the spatial search object used for the source dataset.
bool initComputeReciprocal()
Internal computation initialization for reciprocal correspondences.
IndicesPtr target_indices_
The target point cloud dataset indices.
shared_ptr< CorrespondenceEstimationBase< PointSource, PointTarget, Scalar > > Ptr
search::KdTree is a wrapper class which inherits the pcl::KdTree class for performing search function...
Definition kdtree.h:62
shared_ptr< KdTree< PointT, Tree > > Ptr
Definition kdtree.h:75
std::vector< pcl::Correspondence, Eigen::aligned_allocator< pcl::Correspondence > > Correspondences
void fromPCLPointCloud2(const pcl::PCLPointCloud2 &msg, pcl::PointCloud< PointT > &cloud, const MsgFieldMap &field_map)
Convert a PCLPointCloud2 binary data blob into a pcl::PointCloud<T> object using a field_map.
A point structure representing normal coordinates and the surface curvature estimate.
shared_ptr< const ::pcl::PCLPointCloud2 > ConstPtr