AliceVision
Photogrammetric Computer Vision Framework
TranslationTripletKernelACRansac.hpp
1 // This file is part of the AliceVision project.
2 // Copyright (c) 2016 AliceVision contributors.
3 // Copyright (c) 2012 openMVG contributors.
4 // This Source Code Form is subject to the terms of the Mozilla Public License,
5 // v. 2.0. If a copy of the MPL was not distributed with this file,
6 // You can obtain one at https://mozilla.org/MPL/2.0/.
7 
8 #pragma once
9 
10 #include <aliceVision/numeric/numeric.hpp>
11 #include <aliceVision/robustEstimation/conditioning.hpp>
12 #include <aliceVision/linearProgramming/linearProgramming.hpp>
13 #include <aliceVision/robustEstimation/IRansacKernel.hpp>
14 #include <aliceVision/robustEstimation/ACRansac.hpp>
15 
16 namespace aliceVision {
17 namespace sfm {
18 
19 using namespace aliceVision::trifocal::kernel;
20 
22 template<typename SolverT_, typename ErrorT_, typename ModelT_>
24 {
25  public:
26  using SolverT = SolverT_;
27  using ErrorT = SolverT_;
28  using ModelT = ModelT_;
29 
31  const Mat& x2,
32  const Mat& x3,
33  const std::vector<Mat3>& vec_KRi,
34  const Mat3& K,
35  const double ThresholdUpperBound)
36  : _x1(x1),
37  _x2(x2),
38  _x3(x3),
39  _vecKR(vec_KRi),
40  _K(K),
41  _thresholdUpperBound(ThresholdUpperBound),
42  _logalpha0(log10(M_PI)),
43  _Kinv(K.inverse())
44  {
45  // Normalize points by inverse(K)
46  robustEstimation::applyTransformationToPoints(_x1, _Kinv, &_x1n);
47  robustEstimation::applyTransformationToPoints(_x2, _Kinv, &_x2n);
48  robustEstimation::applyTransformationToPoints(_x3, _Kinv, &_x3n);
49 
50  _vecKR[0] = _Kinv * _vecKR[0];
51  _vecKR[1] = _Kinv * _vecKR[1];
52  _vecKR[2] = _Kinv * _vecKR[2];
53  }
58  inline std::size_t getMinimumNbRequiredSamples() const override { return _kernelSolver.getMinimumNbRequiredSamples(); }
59 
64  inline std::size_t getMaximumNbModels() const override { return _kernelSolver.getMaximumNbModels(); }
65 
66  void fit(const std::vector<std::size_t>& samples, std::vector<ModelT_>& models) const override
67  {
68  // create a model from the points
69  _kernelSolver.solve(
70  buildSubsetMatrix(_x1n, samples), buildSubsetMatrix(_x2n, samples), buildSubsetMatrix(_x3n, samples), _vecKR, models, _thresholdUpperBound);
71  }
72 
79  double error(std::size_t sample, const ModelT_& model) const override
80  {
81  return _errorEstimator.error(model, _x1n.col(sample), _x2n.col(sample), _x3n.col(sample));
82  }
83 
84  void errors(const ModelT_& model, std::vector<double>& errors) const override
85  {
86  for (std::size_t sample = 0; sample < _x1n.cols(); ++sample)
87  errors[sample] = error(sample, model);
88  }
89 
90  std::size_t nbSamples() const override { return _x1n.cols(); }
91 
92  void unnormalize(ModelT_& model) const override
93  {
94  // unnormalize model from the computed conditioning.
95  model.P1 = _K * model.P1;
96  model.P2 = _K * model.P2;
97  model.P3 = _K * model.P3;
98  }
99 
100  double logalpha0() const override { return _logalpha0; }
101 
102  double errorVectorDimension() const override { return 2.0; }
103 
104  Mat3 normalizer1() const override { return _Kinv; }
105 
106  double thresholdNormalizer() const override { return 1.0; }
107 
108  double unormalizeError(double val) const override { return std::sqrt(val) / _Kinv(0, 0); }
109 
110  std::size_t getMinimumNbRequiredSamplesLS() const
111  {
112  throw std::logic_error("TranslationTripletKernelACRansac cannot be used in LO_RANSAC.");
113  return 0;
114  }
115 
116  void fitLS(const std::vector<std::size_t>& inliers, std::vector<ModelT>& models, const std::vector<double>* weights = nullptr) const
117  {
118  throw std::logic_error("TranslationTripletKernelACRansac cannot be used in LO_RANSAC.");
119  }
120 
121  void computeWeights(const ModelT& model, const std::vector<std::size_t>& inliers, std::vector<double>& weights, const double eps = 0.001) const
122  {
123  throw std::logic_error("TranslationTripletKernelACRansac cannot be used in LO_RANSAC.");
124  }
125 
126  private:
127  const Mat& _x1;
128  const Mat& _x2;
129  const Mat& _x3;
130  Mat _x1n;
131  Mat _x2n;
132  Mat _x3n;
133  const Mat3 _Kinv, _K;
134  const double _logalpha0;
135  const double _thresholdUpperBound;
136  std::vector<Mat3> _vecKR;
137 
139  const SolverT _kernelSolver = SolverT();
141  const ErrorT _errorEstimator = ErrorT();
142 };
143 
144 } // namespace sfm
145 } // namespace aliceVision
aliceVision::sfm::TranslationTripletKernelACRansac::getMaximumNbModels
std::size_t getMaximumNbModels() const override
Return the maximum number of models for the solver.
Definition: TranslationTripletKernelACRansac.hpp:64
aliceVision::sfm::TranslationTripletKernelACRansac::getMinimumNbRequiredSamples
std::size_t getMinimumNbRequiredSamples() const override
Return the minimum number of required samples for the solver.
Definition: TranslationTripletKernelACRansac.hpp:58
aliceVision::buildSubsetMatrix
TMat buildSubsetMatrix(const TMat &A, const TCols &columns)
It extracts the columns of given indices from the given matrix.
Definition: Container.hpp:124
aliceVision
Definition: checkerDetector.cpp:32
aliceVision::sfm::TranslationTripletKernelACRansac::fitLS
void fitLS(const std::vector< std::size_t > &inliers, std::vector< ModelT > &models, const std::vector< double > *weights=nullptr) const
This function is called to estimate the model using a least squared algorithm from a minimum of minSa...
Definition: TranslationTripletKernelACRansac.hpp:116
aliceVision::sfm::TranslationTripletKernelACRansac::computeWeights
void computeWeights(const ModelT &model, const std::vector< std::size_t > &inliers, std::vector< double > &weights, const double eps=0.001) const
Function used to estimate the weights, typically used by the least square algorithm.
Definition: TranslationTripletKernelACRansac.hpp:121
aliceVision::sfm::TranslationTripletKernelACRansac
AContrario Kernel to solve a translation triplet & structure problem.
Definition: TranslationTripletKernelACRansac.hpp:23
aliceVision::sfm::TranslationTripletKernelACRansac::error
double error(std::size_t sample, const ModelT_ &model) const override
error
Definition: TranslationTripletKernelACRansac.hpp:79
aliceVision::sfm::TranslationTripletKernelACRansac::unnormalize
void unnormalize(ModelT_ &model) const override
Function used to unnormalize the model.
Definition: TranslationTripletKernelACRansac.hpp:92
aliceVision::robustEstimation::IRansacKernel
A generic kernel used for the ACRANSAC / LORANSAC framework.
Definition: IRansacKernel.hpp:24
aliceVision::sfm::TranslationTripletKernelACRansac::fit
void fit(const std::vector< std::size_t > &samples, std::vector< ModelT_ > &models) const override
This function is called to estimate the model from the minimum number of sample minSample (i....
Definition: TranslationTripletKernelACRansac.hpp:66
aliceVision::sfm::TranslationTripletKernelACRansac::errors
void errors(const ModelT_ &model, std::vector< double > &errors) const override
Function that computes the estimation error for a given model and all the elements.
Definition: TranslationTripletKernelACRansac.hpp:84