Point Cloud Library (PCL) 1.12.0
Loading...
Searching...
No Matches
sac_model_line.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/sample_consensus/sac_model.h>
44#include <pcl/sample_consensus/model_types.h>
45
46namespace pcl
47{
48 /** \brief SampleConsensusModelLine defines a model for 3D line segmentation.
49 * The model coefficients are defined as:
50 * - \b point_on_line.x : the X coordinate of a point on the line
51 * - \b point_on_line.y : the Y coordinate of a point on the line
52 * - \b point_on_line.z : the Z coordinate of a point on the line
53 * - \b line_direction.x : the X coordinate of a line's direction
54 * - \b line_direction.y : the Y coordinate of a line's direction
55 * - \b line_direction.z : the Z coordinate of a line's direction
56 *
57 * \author Radu B. Rusu
58 * \ingroup sample_consensus
59 */
60 template <typename PointT>
62 {
63 public:
69
73
76
77 /** \brief Constructor for base SampleConsensusModelLine.
78 * \param[in] cloud the input point cloud dataset
79 * \param[in] random if true set the random seed to the current time, else set to 12345 (default: false)
80 */
83 {
84 model_name_ = "SampleConsensusModelLine";
85 sample_size_ = 2;
86 model_size_ = 6;
87 }
88
89 /** \brief Constructor for base SampleConsensusModelLine.
90 * \param[in] cloud the input point cloud dataset
91 * \param[in] indices a vector of point indices to be used from \a cloud
92 * \param[in] random if true set the random seed to the current time, else set to 12345 (default: false)
93 */
95 const Indices &indices,
96 bool random = false)
97 : SampleConsensusModel<PointT> (cloud, indices, random)
98 {
99 model_name_ = "SampleConsensusModelLine";
100 sample_size_ = 2;
101 model_size_ = 6;
102 }
103
104 /** \brief Empty destructor */
106
107 /** \brief Check whether the given index samples can form a valid line model, compute the model coefficients from
108 * these samples and store them internally in model_coefficients_. The line coefficients are represented by a
109 * point and a line direction
110 * \param[in] samples the point indices found as possible good candidates for creating a valid model
111 * \param[out] model_coefficients the resultant model coefficients
112 */
113 bool
115 Eigen::VectorXf &model_coefficients) const override;
116
117 /** \brief Compute all squared distances from the cloud data to a given line model.
118 * \param[in] model_coefficients the coefficients of a line model that we need to compute distances to
119 * \param[out] distances the resultant estimated squared distances
120 */
121 void
122 getDistancesToModel (const Eigen::VectorXf &model_coefficients,
123 std::vector<double> &distances) const override;
124
125 /** \brief Select all the points which respect the given model coefficients as inliers.
126 * \param[in] model_coefficients the coefficients of a line model that we need to compute distances to
127 * \param[in] threshold a maximum admissible distance threshold for determining the inliers from the outliers
128 * \param[out] inliers the resultant model inliers
129 */
130 void
131 selectWithinDistance (const Eigen::VectorXf &model_coefficients,
132 const double threshold,
133 Indices &inliers) override;
134
135 /** \brief Count all the points which respect the given model coefficients as inliers.
136 *
137 * \param[in] model_coefficients the coefficients of a model that we need to compute distances to
138 * \param[in] threshold maximum admissible distance threshold for determining the inliers from the outliers
139 * \return the resultant number of inliers
140 */
141 std::size_t
142 countWithinDistance (const Eigen::VectorXf &model_coefficients,
143 const double threshold) const override;
144
145 /** \brief Recompute the line coefficients using the given inlier set and return them to the user.
146 * @note: these are the coefficients of the line model after refinement (e.g. after SVD)
147 * \param[in] inliers the data inliers found as supporting the model
148 * \param[in] model_coefficients the initial guess for the model coefficients
149 * \param[out] optimized_coefficients the resultant recomputed coefficients after optimization
150 */
151 void
153 const Eigen::VectorXf &model_coefficients,
154 Eigen::VectorXf &optimized_coefficients) const override;
155
156 /** \brief Create a new point cloud with inliers projected onto the line model.
157 * \param[in] inliers the data inliers that we want to project on the line model
158 * \param[in] model_coefficients the *normalized* coefficients of a line model
159 * \param[out] projected_points the resultant projected points
160 * \param[in] copy_data_fields set to true if we need to copy the other data fields
161 */
162 void
164 const Eigen::VectorXf &model_coefficients,
166 bool copy_data_fields = true) const override;
167
168 /** \brief Verify whether a subset of indices verifies the given line model coefficients.
169 * \param[in] indices the data indices that need to be tested against the line model
170 * \param[in] model_coefficients the line model coefficients
171 * \param[in] threshold a maximum admissible distance threshold for determining the inliers from the outliers
172 */
173 bool
174 doSamplesVerifyModel (const std::set<index_t> &indices,
175 const Eigen::VectorXf &model_coefficients,
176 const double threshold) const override;
177
178 /** \brief Return a unique id for this model (SACMODEL_LINE). */
179 inline pcl::SacModel
180 getModelType () const override { return (SACMODEL_LINE); }
181
182 protected:
185
186 /** \brief Check if a sample of indices results in a good sample of points
187 * indices.
188 * \param[in] samples the resultant index samples
189 */
190 bool
191 isSampleGood (const Indices &samples) const override;
192 };
193}
194
195#ifdef PCL_NO_PRECOMPILE
196#include <pcl/sample_consensus/impl/sac_model_line.hpp>
197#endif
Iterator class for point clouds with or without given indices.
PointCloud represents the base class in PCL for storing collections of 3D points.
SampleConsensusModel represents the base model class.
Definition sac_model.h:70
unsigned int sample_size_
The size of a sample from which the model is computed.
Definition sac_model.h:588
typename PointCloud::ConstPtr PointCloudConstPtr
Definition sac_model.h:73
IndicesPtr indices_
A pointer to the vector of point indices to use.
Definition sac_model.h:556
PointCloudConstPtr input_
A boost shared pointer to the point cloud data array.
Definition sac_model.h:553
virtual bool isModelValid(const Eigen::VectorXf &model_coefficients) const
Check whether a model is valid given the user constraints.
Definition sac_model.h:527
std::string model_name_
The model name.
Definition sac_model.h:550
unsigned int model_size_
The number of coefficients in the model.
Definition sac_model.h:591
typename PointCloud::Ptr PointCloudPtr
Definition sac_model.h:74
std::vector< double > error_sqr_dists_
A vector holding the distances to the computed model.
Definition sac_model.h:585
SampleConsensusModelLine defines a model for 3D line segmentation.
typename SampleConsensusModel< PointT >::PointCloudPtr PointCloudPtr
bool computeModelCoefficients(const Indices &samples, Eigen::VectorXf &model_coefficients) const override
Check whether the given index samples can form a valid line model, compute the model coefficients fro...
std::size_t countWithinDistance(const Eigen::VectorXf &model_coefficients, const double threshold) const override
Count all the points which respect the given model coefficients as inliers.
void getDistancesToModel(const Eigen::VectorXf &model_coefficients, std::vector< double > &distances) const override
Compute all squared distances from the cloud data to a given line model.
SampleConsensusModelLine(const PointCloudConstPtr &cloud, const Indices &indices, bool random=false)
Constructor for base SampleConsensusModelLine.
bool isSampleGood(const Indices &samples) const override
Check if a sample of indices results in a good sample of points indices.
pcl::SacModel getModelType() const override
Return a unique id for this model (SACMODEL_LINE).
SampleConsensusModelLine(const PointCloudConstPtr &cloud, bool random=false)
Constructor for base SampleConsensusModelLine.
bool doSamplesVerifyModel(const std::set< index_t > &indices, const Eigen::VectorXf &model_coefficients, const double threshold) const override
Verify whether a subset of indices verifies the given line model coefficients.
void optimizeModelCoefficients(const Indices &inliers, const Eigen::VectorXf &model_coefficients, Eigen::VectorXf &optimized_coefficients) const override
Recompute the line coefficients using the given inlier set and return them to the user.
typename SampleConsensusModel< PointT >::PointCloudConstPtr PointCloudConstPtr
void projectPoints(const Indices &inliers, const Eigen::VectorXf &model_coefficients, PointCloud &projected_points, bool copy_data_fields=true) const override
Create a new point cloud with inliers projected onto the line model.
typename SampleConsensusModel< PointT >::PointCloud PointCloud
~SampleConsensusModelLine()
Empty destructor.
void selectWithinDistance(const Eigen::VectorXf &model_coefficients, const double threshold, Indices &inliers) override
Select all the points which respect the given model coefficients as inliers.
IndicesAllocator<> Indices
Type used for indices in PCL.
Definition types.h:133
@ SACMODEL_LINE
Definition model_types.h:48
A point structure representing Euclidean xyz coordinates, and the RGB color.