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