diff --git a/sample_consensus/include/pcl/sample_consensus/sac_model.h b/sample_consensus/include/pcl/sample_consensus/sac_model.h index 39f066a7254..dada7ae0d07 100644 --- a/sample_consensus/include/pcl/sample_consensus/sac_model.h +++ b/sample_consensus/include/pcl/sample_consensus/sac_model.h @@ -48,6 +48,7 @@ #include // for uniform_int #include // for variate_generator #include +#include #include #include @@ -101,41 +102,14 @@ namespace pcl } public: - /** \brief Constructor for base SampleConsensusModel. - * \param[in] cloud the input point cloud dataset - * \param[in] random if true set the random seed to the current time, else set to 12345 (default: false) - */ - SampleConsensusModel (const PointCloudConstPtr &cloud, bool random = false) - : input_ () - , radius_min_ (-std::numeric_limits::max ()) - , radius_max_ (std::numeric_limits::max ()) - , samples_radius_ (0.) - , samples_radius_search_ () - , rng_dist_ (new boost::uniform_int<> (0, std::numeric_limits::max ())) - , custom_model_constraints_ ([](auto){return true;}) - { - if (random) - rng_alg_.seed (std::random_device()()); - else - rng_alg_.seed (12345u); - - // Sets the input cloud and creates a vector of "fake" indices - setInputCloud (cloud); - - // Create a random number generator object - rng_gen_.reset (new boost::variate_generator > (rng_alg_, *rng_dist_)); - } - /** \brief Constructor for base SampleConsensusModel. * \param[in] cloud the input point cloud dataset * \param[in] indices a vector of point indices to be used from \a cloud * \param[in] random if true set the random seed to the current time, else set to 12345 (default: false) */ - SampleConsensusModel (const PointCloudConstPtr &cloud, - const Indices &indices, - bool random = false) + SampleConsensusModel (const PointCloudConstPtr &cloud, const Indices &indices = Indices(), const bool random = false) : input_ (cloud) - , indices_ (new Indices (indices)) + , indices_(new Indices(indices)) , radius_min_ (-std::numeric_limits::max ()) , radius_max_ (std::numeric_limits::max ()) , samples_radius_ (0.) @@ -148,6 +122,13 @@ namespace pcl else rng_alg_.seed (12345u); + // If no indices are provided, use all points + if (indices_->empty()) + { + indices_->resize(cloud->size()); + std::iota(indices_->begin(), indices_->end(), 0); + } + if (indices_->size () > input_->size ()) { PCL_ERROR("[pcl::SampleConsensusModel] Invalid index vector given with size " @@ -160,7 +141,14 @@ namespace pcl // Create a random number generator object rng_gen_.reset (new boost::variate_generator > (rng_alg_, *rng_dist_)); - }; + } + + /** \brief Constructor for base SampleConsensusModel. + * \param[in] cloud the input point cloud dataset + * \param[in] random if true set the random seed to the current time, else set to 12345 (default: false) + */ + SampleConsensusModel (const PointCloudConstPtr &cloud, const bool random = false) + : SampleConsensusModel(cloud, Indices(), random) {}; /** \brief Destructor for base SampleConsensusModel. */ virtual ~SampleConsensusModel () = default;