Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 18 additions & 30 deletions sample_consensus/include/pcl/sample_consensus/sac_model.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
#include <boost/random/uniform_int.hpp> // for uniform_int
#include <boost/random/variate_generator.hpp> // for variate_generator
#include <random>
#include <numeric>

#include <pcl/memory.h>
#include <pcl/console/print.h>
Expand Down Expand Up @@ -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<double>::max ())
, radius_max_ (std::numeric_limits<double>::max ())
, samples_radius_ (0.)
, samples_radius_search_ ()
, rng_dist_ (new boost::uniform_int<> (0, std::numeric_limits<int>::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<boost::mt19937&, boost::uniform_int<> > (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<double>::max ())
, radius_max_ (std::numeric_limits<double>::max ())
, samples_radius_ (0.)
Expand All @@ -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 "
Expand All @@ -160,7 +141,14 @@ namespace pcl

// Create a random number generator object
rng_gen_.reset (new boost::variate_generator<boost::mt19937&, boost::uniform_int<> > (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;
Expand Down