1 /****************************************************************************** 2 * Authors: Laurent Kneip & Paul Furgale * 3 * Contact: kneip.laurent@gmail.com * 4 * License: Copyright (c) 2013 Laurent Kneip, ANU. All rights reserved. * 5 * * 6 * Redistribution and use in source and binary forms, with or without * 7 * modification, are permitted provided that the following conditions * 8 * are met: * 9 * * Redistributions of source code must retain the above copyright * 10 * notice, this list of conditions and the following disclaimer. * 11 * * Redistributions in binary form must reproduce the above copyright * 12 * notice, this list of conditions and the following disclaimer in the * 13 * documentation and/or other materials provided with the distribution. * 14 * * Neither the name of ANU nor the names of its contributors may be * 15 * used to endorse or promote products derived from this software without * 16 * specific prior written permission. * 17 * * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"* 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * 21 * ARE DISCLAIMED. IN NO EVENT SHALL ANU OR THE CONTRIBUTORS BE LIABLE * 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * 24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * 25 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * 26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * 27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * 28 * SUCH DAMAGE. * 29 ******************************************************************************/ 30 31 //Note: has been derived from ROS 32 33 /** 34 * \file SampleConsensus.hpp 35 * \brief This is a base class for sample consensus methods such as Ransac. 36 * Derivatives call the three basic functions of a sample-consensus 37 * problem (sample drawing, computation of a hypothesis, and verification 38 * of a hypothesis). 39 */ 40 41 #ifndef OPENGV_SAC_SAMPLECONSENSUS_HPP_ 42 #define OPENGV_SAC_SAMPLECONSENSUS_HPP_ 43 44 #include <memory> 45 46 /** 47 * \brief The namespace of this library. 48 */ 49 namespace opengv 50 { 51 /** 52 * \brief The namespace for the sample consensus methods. 53 */ 54 namespace sac 55 { 56 57 /** 58 * Super-class for sample consensus methods, such as Ransac. 59 */ 60 template<typename PROBLEM_T> 61 class SampleConsensus 62 { 63 public: 64 EIGEN_MAKE_ALIGNED_OPERATOR_NEW 65 /** A child of SampleConsensusProblem */ 66 typedef PROBLEM_T problem_t; 67 /** The model we trying to fit */ 68 typedef typename problem_t::model_t model_t; 69 70 /** 71 * \brief Constructor. 72 * \param[in] maxIterations The maximum number of hypothesis generations 73 * \param[in] threshold Some threshold value for classifying samples as 74 * an inlier or an outlier. 75 * \param[in] probability The probability of being able to draw at least one 76 * sample that is free of outliers (see [15]) 77 */ 78 SampleConsensus( 79 int maxIterations = 1000, 80 double threshold = 1.0, 81 double probability = 0.99 ); 82 /** 83 * \brief Destructor 84 */ 85 virtual ~SampleConsensus(); 86 87 /** 88 * \brief Fit the model to the data. 89 * \param[in] debug_verbosity_level Sets the verbosity level. 90 * \return bool True if success. 91 */ 92 virtual bool computeModel( 93 int debug_verbosity_level = 0 ) = 0; 94 95 // \todo accessors 96 //private: 97 98 /** the maximum number of iterations */ 99 int max_iterations_; 100 /** the current number of iterations */ 101 int iterations_; 102 /** the threshold for classifying inliers */ 103 double threshold_; 104 /** the current probability (defines remaining iterations) */ 105 double probability_; 106 /** the currently best model coefficients */ 107 model_t model_coefficients_; 108 /** the indices for the currently best hypothesis */ 109 std::vector<int> model_; 110 /** the indices of the samples that have been clasified as inliers */ 111 std::vector<int> inliers_; 112 /** the sample-consensus problem we are trying to solve */ 113 std::shared_ptr<PROBLEM_T> sac_model_; 114 }; 115 116 } // namespace sac 117 } // namespace opengv 118 119 #include "implementation/SampleConsensus.hpp" 120 121 #endif /* OPENGV_SAC_SAMPLECONSENSUS_HPP_ */ 122