1 /* 2 * Software License Agreement (BSD License) 3 * 4 * Point Cloud Library (PCL) - www.pointclouds.org 5 * Copyright (c) 2009, 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.h> 44 #include <pcl/sample_consensus/sac_model.h> 45 46 namespace pcl 47 { 48 /** \brief @b RandomizedRandomSampleConsensus represents an implementation of the RRANSAC (Randomized RANdom SAmple 49 * Consensus), as described in "Randomized RANSAC with Td,d test", O. Chum and J. Matas, Proc. British Machine Vision 50 * Conf. (BMVC '02), vol. 2, BMVA, pp. 448-457, 2002. 51 * 52 * The algorithm works similar to RANSAC, with one addition: after computing the model coefficients, randomly select a fraction 53 * of points. If any of these points do not belong to the model (given a threshold), continue with the next iteration instead 54 * of checking all points. This may speed up the finding of the model if the fraction of points to pre-test is chosen well. 55 * \note RRANSAC is useful in situations where most of the data samples belong to the model, and a fast outlier rejection algorithm is needed. 56 * \author Radu B. Rusu 57 * \ingroup sample_consensus 58 */ 59 template <typename PointT> 60 class RandomizedRandomSampleConsensus : public SampleConsensus<PointT> 61 { 62 using SampleConsensusModelPtr = typename SampleConsensusModel<PointT>::Ptr; 63 64 public: 65 using Ptr = shared_ptr<RandomizedRandomSampleConsensus<PointT> >; 66 using ConstPtr = shared_ptr<const RandomizedRandomSampleConsensus<PointT> >; 67 68 using SampleConsensus<PointT>::max_iterations_; 69 using SampleConsensus<PointT>::threshold_; 70 using SampleConsensus<PointT>::iterations_; 71 using SampleConsensus<PointT>::sac_model_; 72 using SampleConsensus<PointT>::model_; 73 using SampleConsensus<PointT>::model_coefficients_; 74 using SampleConsensus<PointT>::inliers_; 75 using SampleConsensus<PointT>::probability_; 76 77 /** \brief RRANSAC (Randomized RANdom SAmple Consensus) main constructor 78 * \param[in] model a Sample Consensus model 79 */ RandomizedRandomSampleConsensus(const SampleConsensusModelPtr & model)80 RandomizedRandomSampleConsensus (const SampleConsensusModelPtr &model) 81 : SampleConsensus<PointT> (model) 82 , fraction_nr_pretest_ (10.0) // Number of samples to try randomly in percents 83 { 84 // Maximum number of trials before we give up. 85 max_iterations_ = 10000; 86 } 87 88 /** \brief RRANSAC (Randomized RANdom SAmple Consensus) main constructor 89 * \param[in] model a Sample Consensus model 90 * \param[in] threshold distance to model threshold 91 */ RandomizedRandomSampleConsensus(const SampleConsensusModelPtr & model,double threshold)92 RandomizedRandomSampleConsensus (const SampleConsensusModelPtr &model, double threshold) 93 : SampleConsensus<PointT> (model, threshold) 94 , fraction_nr_pretest_ (10.0) // Number of samples to try randomly in percents 95 { 96 // Maximum number of trials before we give up. 97 max_iterations_ = 10000; 98 } 99 100 /** \brief Compute the actual model and find the inliers 101 * \param[in] debug_verbosity_level enable/disable on-screen debug information and set the verbosity level 102 */ 103 bool 104 computeModel (int debug_verbosity_level = 0) override; 105 106 /** \brief Set the percentage of points to pre-test. 107 * \param[in] nr_pretest percentage of points to pre-test 108 */ 109 inline void setFractionNrPretest(double nr_pretest)110 setFractionNrPretest (double nr_pretest) { fraction_nr_pretest_ = nr_pretest; } 111 112 /** \brief Get the percentage of points to pre-test. */ 113 inline double getFractionNrPretest()114 getFractionNrPretest () const { return (fraction_nr_pretest_); } 115 116 private: 117 /** \brief Number of samples to randomly pre-test, in percents. */ 118 double fraction_nr_pretest_; 119 }; 120 } 121 122 #ifdef PCL_NO_PRECOMPILE 123 #include <pcl/sample_consensus/impl/rransac.hpp> 124 #endif 125