40 #ifndef PCL_SAMPLE_CONSENSUS_MODEL_H_
41 #define PCL_SAMPLE_CONSENSUS_MODEL_H_
47 #include <boost/random.hpp>
57 template<
class T>
class ProgressiveSampleConsensus;
64 template <
typename Po
intT>
73 typedef boost::shared_ptr<SampleConsensusModel>
Ptr;
74 typedef boost::shared_ptr<const SampleConsensusModel>
ConstPtr;
83 radius_min_ (-std::numeric_limits<double>::max()), radius_max_ (std::numeric_limits<double>::max()), samples_radius_ (0.),
86 rng_dist_ (new boost::uniform_int<> (0, std::numeric_limits<int>::max ())),
91 rng_alg_.seed (static_cast<unsigned> (std::time(0)));
93 rng_alg_.seed (12345u);
95 rng_gen_.reset (
new boost::variate_generator<boost::mt19937&, boost::uniform_int<> > (rng_alg_, *rng_dist_));
106 radius_min_ (-std::numeric_limits<double>::max()), radius_max_ (std::numeric_limits<double>::max()), samples_radius_ (0.),
107 shuffled_indices_ (),
109 rng_dist_ (new boost::uniform_int<> (0, std::numeric_limits<int>::max ())),
113 rng_alg_.seed (static_cast<unsigned> (std::time(0)));
115 rng_alg_.seed (12345u);
121 rng_gen_.reset (
new boost::variate_generator<boost::mt19937&, boost::uniform_int<> > (rng_alg_, *rng_dist_));
131 indices_ (new std::vector<int> (indices)),
132 radius_min_ (-std::numeric_limits<double>::max()), radius_max_ (std::numeric_limits<double>::max()), samples_radius_ (0.),
133 shuffled_indices_ (),
135 rng_dist_ (new boost::uniform_int<> (0, std::numeric_limits<int>::max ())),
139 rng_alg_.seed (static_cast<unsigned> (std::time(0)));
141 rng_alg_.seed (12345u);
143 if (indices_->size () > input_->points.size ())
145 PCL_ERROR (
"[pcl::SampleConsensusModel] Invalid index vector given with size %zu while the input PointCloud has size %zu!\n", indices_->size (), input_->points.size ());
148 shuffled_indices_ = *indices_;
151 rng_gen_.reset (
new boost::variate_generator<boost::mt19937&, boost::uniform_int<> > (rng_alg_, *rng_dist_));
168 PCL_ERROR (
"[pcl::SampleConsensusModel::getSamples] Can not select %zu unique points out of %zu!\n",
169 samples.size (), indices_->size ());
172 iterations = INT_MAX - 1;
178 for (
unsigned int iter = 0; iter < max_sample_checks_; ++iter)
181 if(samples_radius_ < std::numeric_limits<double>::epsilon())
187 if (isSampleGood (samples))
190 PCL_DEBUG (
"[pcl::SampleConsensusModel::getSamples] WARNING: Could not select %d sample points in %d iterations!\n",
getSampleSize (), max_sample_checks_);
203 Eigen::VectorXf &model_coefficients) = 0;
217 const Eigen::VectorXf &model_coefficients,
218 Eigen::VectorXf &optimized_coefficients) = 0;
227 std::vector<double> &distances) = 0;
239 const double threshold,
240 std::vector<int> &inliers) = 0;
253 const double threshold) = 0;
265 const Eigen::VectorXf &model_coefficients,
267 bool copy_data_fields =
true) = 0;
279 const Eigen::VectorXf &model_coefficients,
280 const double threshold) = 0;
290 indices_.reset (
new std::vector<int> ());
291 if (indices_->empty ())
294 indices_->resize (cloud->points.size ());
295 for (
size_t i = 0; i < cloud->points.size (); ++i)
296 (*indices_)[i] =
static_cast<int> (i);
298 shuffled_indices_ = *indices_;
309 setIndices (
const boost::shared_ptr <std::vector<int> > &indices)
312 shuffled_indices_ = *indices_;
321 indices_.reset (
new std::vector<int> (indices));
322 shuffled_indices_ = indices;
326 inline boost::shared_ptr <std::vector<int> >
337 std::map<pcl::SacModel, unsigned int>::const_iterator it = SAC_SAMPLE_SIZE.find (
getModelType ());
338 if (it == SAC_SAMPLE_SIZE.end ())
352 radius_min_ = min_radius;
353 radius_max_ = max_radius;
365 min_radius = radius_min_;
366 max_radius = radius_max_;
375 samples_radius_ = radius;
376 samples_radius_search_ = search;
386 radius = samples_radius_;
396 drawIndexSample (std::vector<int> &sample)
398 size_t sample_size = sample.size ();
399 size_t index_size = shuffled_indices_.size ();
400 for (
unsigned int i = 0; i < sample_size; ++i)
404 std::swap (shuffled_indices_[i], shuffled_indices_[i + (rnd () % (index_size - i))]);
405 std::copy (shuffled_indices_.begin (), shuffled_indices_.begin () + sample_size, sample.begin ());
413 drawIndexSampleRadius (std::vector<int> &sample)
415 size_t sample_size = sample.size ();
416 size_t index_size = shuffled_indices_.size ();
418 std::swap (shuffled_indices_[0], shuffled_indices_[0 + (rnd () % (index_size - 0))]);
421 std::vector<int> indices;
422 std::vector<float> sqr_dists;
424 samples_radius_search_->radiusSearch (shuffled_indices_[0], samples_radius_,
425 indices, sqr_dists );
427 if (indices.size () < sample_size - 1)
430 for(
unsigned int i = 1; i < sample_size; ++i)
431 shuffled_indices_[i] = shuffled_indices_[0];
435 for (
unsigned int i = 0; i < sample_size-1; ++i)
436 std::swap (indices[i], indices[i + (rnd () % (indices.size () - i))]);
437 for (
unsigned int i = 1; i < sample_size; ++i)
438 shuffled_indices_[i] = indices[i-1];
441 std::copy (shuffled_indices_.begin (), shuffled_indices_.begin () + sample_size, sample.begin ());
448 isModelValid (
const Eigen::VectorXf &model_coefficients) = 0;
455 isSampleGood (
const std::vector<int> &samples)
const = 0;
461 boost::shared_ptr <std::vector<int> > indices_;
464 static const unsigned int max_sample_checks_ = 1000;
469 double radius_min_, radius_max_;
472 double samples_radius_;
478 std::vector<int> shuffled_indices_;
481 boost::mt19937 rng_alg_;
484 boost::shared_ptr<boost::uniform_int<> > rng_dist_;
487 boost::shared_ptr<boost::variate_generator< boost::mt19937&, boost::uniform_int<> > > rng_gen_;
493 return ((*rng_gen_) ());
496 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
502 template <
typename Po
intT,
typename Po
intNT>
509 typedef boost::shared_ptr<SampleConsensusModelFromNormals>
Ptr;
510 typedef boost::shared_ptr<const SampleConsensusModelFromNormals>
ConstPtr;
526 normal_distance_weight_ = w;
552 double normal_distance_weight_;
564 template<
typename _Scalar,
int NX=Eigen::Dynamic,
int NY=Eigen::Dynamic>
574 typedef Eigen::Matrix<Scalar,ValuesAtCompileTime,1>
ValueType;
575 typedef Eigen::Matrix<Scalar,InputsAtCompileTime,1>
InputType;
576 typedef Eigen::Matrix<Scalar,ValuesAtCompileTime,InputsAtCompileTime>
JacobianType;
584 Functor (
int m_data_points) : m_data_points_ (m_data_points) {}
590 values ()
const {
return (m_data_points_); }
593 const int m_data_points_;
597 #endif //#ifndef PCL_SAMPLE_CONSENSUS_MODEL_H_