1 /****************************************************************************** 2 * Author: Laurent Kneip * 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 /** 32 * \file CentralRelativePoseSacProblem.hpp 33 * \brief Functions for fitting a relative-pose model to a set of bearing-vector 34 * correspondences, using different algorithms (central). Used with a 35 * random sample paradigm for rejecting outlier correspondences. 36 */ 37 38 #ifndef OPENGV_SAC_PROBLEMS_RELATIVE_POSE_CENTRALRELATIVEPOSESACPROBLEM_HPP_ 39 #define OPENGV_SAC_PROBLEMS_RELATIVE_POSE_CENTRALRELATIVEPOSESACPROBLEM_HPP_ 40 41 #include <opengv/sac/SampleConsensusProblem.hpp> 42 #include <opengv/types.hpp> 43 #include <opengv/relative_pose/RelativeAdapterBase.hpp> 44 45 /** 46 * \brief The namespace of this library. 47 */ 48 namespace opengv 49 { 50 /** 51 * \brief The namespace for the sample consensus problems. 52 */ 53 namespace sac_problems 54 { 55 /** 56 * \brief The namespace for the relative pose methods. 57 */ 58 namespace relative_pose 59 { 60 61 /** 62 * Provides functions for fitting an absolute-pose model to a set of 63 * bearing-vector to point correspondences, using different algorithms (only 64 * central case). Used in a sample-consenus paradigm for rejecting 65 * outlier correspondences. 66 */ 67 class CentralRelativePoseSacProblem : 68 public sac::SampleConsensusProblem<transformation_t> 69 { 70 public: 71 /** The model we are trying to fit (transformation) */ 72 typedef transformation_t model_t; 73 /** The type of adapter that is expected by the methods */ 74 typedef opengv::relative_pose::RelativeAdapterBase adapter_t; 75 76 /** The possible algorithms for solving this problem */ 77 typedef enum Algorithm 78 { 79 STEWENIUS = 0, // [5] 80 NISTER = 1, // [6] 81 SEVENPT = 2, // [8] 82 EIGHTPT = 3 // [9,10] 83 } algorithm_t; 84 85 86 /** 87 * \brief Constructor. 88 * \param[in] adapter Visitor holding bearing vector correspondences etc. 89 * \param[in] algorithm The algorithm we want to use. 90 * \param[in] randomSeed Whether to seed the random number generator with 91 * the current time. 92 */ CentralRelativePoseSacProblem(adapter_t & adapter,algorithm_t algorithm,bool randomSeed=true)93 CentralRelativePoseSacProblem(adapter_t & adapter, algorithm_t algorithm, 94 bool randomSeed = true) : 95 sac::SampleConsensusProblem<model_t> (randomSeed), 96 _adapter(adapter), 97 _algorithm(algorithm) 98 { 99 setUniformIndices(adapter.getNumberCorrespondences()); 100 }; 101 102 /** 103 * \brief Constructor. 104 * \param[in] adapter Visitor holding bearing vector correspondences etc. 105 * \param[in] algorithm The algorithm we want to use. 106 * \param[in] indices A vector of indices to be used from all available 107 * correspondences. 108 * \param[in] randomSeed Whether to seed the random number generator with 109 * the current time. 110 */ CentralRelativePoseSacProblem(adapter_t & adapter,algorithm_t algorithm,const std::vector<int> & indices,bool randomSeed=true)111 CentralRelativePoseSacProblem( 112 adapter_t & adapter, 113 algorithm_t algorithm, 114 const std::vector<int> & indices, 115 bool randomSeed = true) : 116 sac::SampleConsensusProblem<model_t> (randomSeed), 117 _adapter(adapter), 118 _algorithm(algorithm) 119 { 120 setIndices(indices); 121 }; 122 123 /** 124 * Destructor. 125 */ ~CentralRelativePoseSacProblem()126 virtual ~CentralRelativePoseSacProblem() {}; 127 128 /** 129 * \brief See parent-class. 130 */ 131 virtual bool computeModelCoefficients( 132 const std::vector<int> & indices, 133 model_t & outModel) const; 134 135 /** 136 * \brief See parent-class. 137 */ 138 virtual void getSelectedDistancesToModel( 139 const model_t & model, 140 const std::vector<int> & indices, 141 std::vector<double> & scores) const; 142 143 /** 144 * \brief See parent-class. 145 */ 146 virtual void optimizeModelCoefficients( 147 const std::vector<int> & inliers, 148 const model_t & model, 149 model_t & optimized_model); 150 151 /** 152 * \brief See parent-class. 153 */ 154 virtual int getSampleSize() const; 155 156 protected: 157 /** The adapter holding all input data. */ 158 adapter_t & _adapter; 159 /** The algorithm we are using. */ 160 algorithm_t _algorithm; 161 }; 162 163 } 164 } 165 } 166 167 #endif //#ifndef OPENGV_SAC_PROBLEMS_RELATIVE_POSE_CENTRALRELATIVEPOSESACPROBLEM_HPP_ 168