Point Cloud Library (PCL) 1.12.1
Loading...
Searching...
No Matches
correspondence_rejection_sample_consensus.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 * Copyright (c) 2012-, Open Perception, Inc.
7 *
8 * All rights reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 *
14 * * Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * * Redistributions in binary form must reproduce the above
17 * copyright notice, this list of conditions and the following
18 * disclaimer in the documentation and/or other materials provided
19 * with the distribution.
20 * * Neither the name of the copyright holder(s) nor the names of its
21 * contributors may be used to endorse or promote products derived
22 * from this software without specific prior written permission.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
27 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
28 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
29 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
30 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
31 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
34 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 * POSSIBILITY OF SUCH DAMAGE.
36 *
37 * $Id$
38 *
39 */
40
41#pragma once
42
43#include <pcl/registration/correspondence_rejection.h>
44#include <pcl/memory.h>
45
46namespace pcl {
47namespace registration {
48/** \brief CorrespondenceRejectorSampleConsensus implements a correspondence rejection
49 * using Random Sample Consensus to identify inliers (and reject outliers)
50 * \author Dirk Holz
51 * \ingroup registration
52 */
53template <typename PointT>
55 using PointCloud = pcl::PointCloud<PointT>;
56 using PointCloudPtr = typename PointCloud::Ptr;
57 using PointCloudConstPtr = typename PointCloud::ConstPtr;
58
59public:
63
64 using Ptr = shared_ptr<CorrespondenceRejectorSampleConsensus<PointT>>;
65 using ConstPtr = shared_ptr<const CorrespondenceRejectorSampleConsensus<PointT>>;
66
67 /** \brief Empty constructor. Sets the inlier threshold to 5cm (0.05m),
68 * and the maximum number of iterations to 1000.
69 */
71 : inlier_threshold_(0.05)
72 , max_iterations_(1000) // std::numeric_limits<int>::max ()
73 , input_()
75 , target_()
76 , refine_(false)
77 , save_inliers_(false)
78 {
79 rejection_name_ = "CorrespondenceRejectorSampleConsensus";
80 }
81
82 /** \brief Empty destructor. */
84
85 /** \brief Get a list of valid correspondences after rejection from the original set
86 * of correspondences. \param[in] original_correspondences the set of initial
87 * correspondences given \param[out] remaining_correspondences the resultant filtered
88 * set of remaining correspondences
89 */
90 inline void
91 getRemainingCorrespondences(const pcl::Correspondences& original_correspondences,
92 pcl::Correspondences& remaining_correspondences) override;
93
94 /** \brief Provide a source point cloud dataset (must contain XYZ data!)
95 * \param[in] cloud a cloud containing XYZ data
96 */
97 virtual inline void
98 setInputSource(const PointCloudConstPtr& cloud)
99 {
100 input_ = cloud;
101 }
102
103 /** \brief Get a pointer to the input point cloud dataset target. */
104 inline PointCloudConstPtr const
106 {
107 return (input_);
108 }
109
110 /** \brief Provide a target point cloud dataset (must contain XYZ data!)
111 * \param[in] cloud a cloud containing XYZ data
112 */
113 virtual inline void
114 setInputTarget(const PointCloudConstPtr& cloud)
115 {
116 target_ = cloud;
117 }
118
119 /** \brief Get a pointer to the input point cloud dataset target. */
120 inline PointCloudConstPtr const
122 {
123 return (target_);
124 }
125
126 /** \brief See if this rejector requires source points */
127 bool
128 requiresSourcePoints() const override
129 {
130 return (true);
131 }
132
133 /** \brief Blob method for setting the source cloud */
134 void
136 {
137 PointCloudPtr cloud(new PointCloud);
138 fromPCLPointCloud2(*cloud2, *cloud);
139 setInputSource(cloud);
140 }
141
142 /** \brief See if this rejector requires a target cloud */
143 bool
144 requiresTargetPoints() const override
145 {
146 return (true);
147 }
148
149 /** \brief Method for setting the target cloud */
150 void
152 {
153 PointCloudPtr cloud(new PointCloud);
154 fromPCLPointCloud2(*cloud2, *cloud);
155 setInputTarget(cloud);
156 }
157
158 /** \brief Set the maximum distance between corresponding points.
159 * Correspondences with distances below the threshold are considered as inliers.
160 * \param[in] threshold Distance threshold in the same dimension as source and target
161 * data sets.
162 */
163 inline void
164 setInlierThreshold(double threshold)
165 {
166 inlier_threshold_ = threshold;
167 };
168
169 /** \brief Get the maximum distance between corresponding points.
170 * \return Distance threshold in the same dimension as source and target data sets.
171 */
172 inline double
174 {
175 return inlier_threshold_;
176 };
177
178 /** \brief Set the maximum number of iterations.
179 * \param[in] max_iterations Maximum number if iterations to run
180 */
181 inline void
182 setMaximumIterations(int max_iterations)
183 {
184 max_iterations_ = std::max(max_iterations, 0);
185 }
186
187 /** \brief Get the maximum number of iterations.
188 * \return max_iterations Maximum number if iterations to run
189 */
190 inline int
192 {
193 return (max_iterations_);
194 }
195
196 /** \brief Get the best transformation after RANSAC rejection.
197 * \return The homogeneous 4x4 transformation yielding the largest number of inliers.
198 */
199 inline Eigen::Matrix4f
201 {
203 };
204
205 /** \brief Specify whether the model should be refined internally using the variance
206 * of the inliers \param[in] refine true if the model should be refined, false
207 * otherwise
208 */
209 inline void
210 setRefineModel(const bool refine)
211 {
212 refine_ = refine;
213 }
214
215 /** \brief Get the internal refine parameter value as set by the user using
216 * setRefineModel */
217 inline bool
219 {
220 return (refine_);
221 }
222
223 /** \brief Get the inlier indices found by the correspondence rejector. This
224 * information is only saved if setSaveInliers(true) was called in advance.
225 * \param[out] inlier_indices Indices for the inliers
226 */
227 inline void
229 {
230 inlier_indices = inlier_indices_;
231 }
232
233 /** \brief Set whether to save inliers or not
234 * \param[in] s True to save inliers / False otherwise
235 */
236 inline void
238 {
239 save_inliers_ = s;
240 }
241
242 /** \brief Get whether the rejector is configured to save inliers */
243 inline bool
245 {
246 return save_inliers_;
247 }
248
249protected:
250 /** \brief Apply the rejection algorithm.
251 * \param[out] correspondences the set of resultant correspondences.
252 */
253 inline void
254 applyRejection(pcl::Correspondences& correspondences) override
255 {
257 }
258
260
262
263 PointCloudConstPtr input_;
264 PointCloudPtr input_transformed_;
265 PointCloudConstPtr target_;
266
267 Eigen::Matrix4f best_transformation_;
268
272
273public:
275};
276} // namespace registration
277} // namespace pcl
278
279#include <pcl/registration/impl/correspondence_rejection_sample_consensus.hpp>
PointCloud represents the base class in PCL for storing collections of 3D points.
shared_ptr< PointCloud< PointT > > Ptr
shared_ptr< const PointCloud< PointT > > ConstPtr
CorrespondencesConstPtr input_correspondences_
The input correspondences.
std::string rejection_name_
The name of the rejection method.
const std::string & getClassName() const
Get a string representation of the name of this class.
bool requiresSourcePoints() const override
See if this rejector requires source points.
double getInlierThreshold()
Get the maximum distance between corresponding points.
virtual void setInputSource(const PointCloudConstPtr &cloud)
Provide a source point cloud dataset (must contain XYZ data!).
shared_ptr< const CorrespondenceRejectorSampleConsensus< PointT > > ConstPtr
Eigen::Matrix4f getBestTransformation()
Get the best transformation after RANSAC rejection.
bool getSaveInliers()
Get whether the rejector is configured to save inliers.
virtual void setInputTarget(const PointCloudConstPtr &cloud)
Provide a target point cloud dataset (must contain XYZ data!).
void setInlierThreshold(double threshold)
Set the maximum distance between corresponding points.
void setMaximumIterations(int max_iterations)
Set the maximum number of iterations.
void getRemainingCorrespondences(const pcl::Correspondences &original_correspondences, pcl::Correspondences &remaining_correspondences) override
Get a list of valid correspondences after rejection from the original set of correspondences.
void setTargetPoints(pcl::PCLPointCloud2::ConstPtr cloud2) override
Method for setting the target cloud.
CorrespondencesConstPtr input_correspondences_
The input correspondences.
bool requiresTargetPoints() const override
See if this rejector requires a target cloud.
bool getRefineModel() const
Get the internal refine parameter value as set by the user using setRefineModel.
PointCloudConstPtr const getInputSource()
Get a pointer to the input point cloud dataset target.
std::string rejection_name_
The name of the rejection method.
PointCloudConstPtr const getInputTarget()
Get a pointer to the input point cloud dataset target.
void applyRejection(pcl::Correspondences &correspondences) override
Apply the rejection algorithm.
void getInliersIndices(pcl::Indices &inlier_indices)
Get the inlier indices found by the correspondence rejector.
void setSourcePoints(pcl::PCLPointCloud2::ConstPtr cloud2) override
Blob method for setting the source cloud.
void setRefineModel(const bool refine)
Specify whether the model should be refined internally using the variance of the inliers.
shared_ptr< CorrespondenceRejectorSampleConsensus< PointT > > Ptr
#define PCL_MAKE_ALIGNED_OPERATOR_NEW
Macro to signal a class requires a custom allocator.
Definition memory.h:63
Defines functions, macros and traits for allocating and using memory.
std::vector< pcl::Correspondence, Eigen::aligned_allocator< pcl::Correspondence > > Correspondences
IndicesAllocator<> Indices
Type used for indices in PCL.
Definition types.h:133
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.
shared_ptr< const ::pcl::PCLPointCloud2 > ConstPtr