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