AliceVision
Photogrammetric Computer Vision Framework
PointFittingKernel.hpp
1 // This file is part of the AliceVision project.
2 // Copyright (c) 2016 AliceVision contributors.
3 // Copyright (c) 2012 openMVG contributors.
4 // Copyright (c) 2010 libmv contributors.
5 // This Source Code Form is subject to the terms of the Mozilla Public License,
6 // v. 2.0. If a copy of the MPL was not distributed with this file,
7 // You can obtain one at https://mozilla.org/MPL/2.0/.
8 
9 #pragma once
10 
11 #include <aliceVision/numeric/numeric.hpp>
12 #include <aliceVision/robustEstimation/conditioning.hpp>
13 #include <aliceVision/robustEstimation/ISolver.hpp>
14 
15 #include <vector>
16 #include <cassert>
17 
18 namespace aliceVision {
19 namespace robustEstimation {
20 
47 template<typename SolverT_, typename ErrorT_, typename ModelT_ = Mat3Model>
49 {
50  public:
51  using SolverT = SolverT_;
52  using ErrorT = ErrorT_;
53  using ModelT = ModelT_;
54 
55  PointFittingKernel(const Mat& x1, const Mat& x2)
56  : _x1(x1),
57  _x2(x2)
58  {}
59 
64  inline std::size_t getMinimumNbRequiredSamples() const { return _kernelSolver.getMinimumNbRequiredSamples(); }
65 
70  inline std::size_t getMaximumNbModels() const { return _kernelSolver.getMaximumNbModels(); }
71 
77  inline virtual void fit(const std::vector<std::size_t>& samples, std::vector<ModelT>& models) const
78  {
79  const Mat x1 = buildSubsetMatrix(_x1, samples);
80  const Mat x2 = buildSubsetMatrix(_x2, samples);
81  _kernelSolver.solve(x1, x2, models);
82  }
83 
90  inline virtual double error(std::size_t sample, const ModelT& model) const
91  {
92  return _errorEstimator.error(model, _x1.col(sample), _x2.col(sample));
93  }
94 
100  inline virtual void errors(const ModelT& model, std::vector<double>& errors) const
101  {
102  errors.resize(_x1.cols());
103  for (std::size_t sample = 0; sample < _x1.cols(); ++sample)
104  errors.at(sample) = error(sample, model);
105  }
106 
111  inline std::size_t nbSamples() const { return _x1.cols(); }
112 
113  protected:
115  const Mat& _x1;
117  const Mat& _x2;
119  const SolverT _kernelSolver{};
121  const ErrorT _errorEstimator{};
122 };
123 
124 template<typename SolverT_, typename ErrorT_, typename UnnormalizerT_, typename ModelT_ = Mat3Model>
125 class NormalizedPointFittingKernel : public PointFittingKernel<SolverT_, ErrorT_, ModelT_>
126 {
127  public:
129 
130  NormalizedPointFittingKernel(const Mat& x1, const Mat& x2)
131  : KernelBase(x1, x2)
132  {}
133 
139  inline void fit(const std::vector<std::size_t>& samples, std::vector<ModelT_>& models) const override
140  {
141  const Mat x1 = buildSubsetMatrix(KernelBase::_x1, samples);
142  const Mat x2 = buildSubsetMatrix(KernelBase::_x2, samples);
143 
144  assert(2 == x1.rows());
145  assert(KernelBase::getMinimumNbRequiredSamples() <= x1.cols());
146  assert(x1.rows() == x2.rows());
147  assert(x1.cols() == x2.cols());
148 
149  // normalize the data.
150  Mat3 T1;
151  Mat3 T2;
152  Mat x1_normalized;
153  Mat x2_normalized;
154 
155  normalizePoints(x1, &x1_normalized, &T1);
156  normalizePoints(x2, &x2_normalized, &T2);
157 
158  KernelBase::_kernelSolver.solve(x1_normalized, x2_normalized, models);
159 
160  // unnormalize model from the computed conditioning.
161  for (int i = 0; i < models.size(); ++i)
162  UnnormalizerT_::unnormalize(T1, T2, &(models.at(i).getMatrix()));
163  }
164 };
165 
166 } // namespace robustEstimation
167 } // namespace aliceVision
aliceVision::robustEstimation::PointFittingKernel
This is one example (targeted at solvers that operate on correspondences between two views) that show...
Definition: PointFittingKernel.hpp:48
aliceVision::robustEstimation::PointFittingKernel::errors
virtual void errors(const ModelT &model, std::vector< double > &errors) const
Return the errors associated to the model and each sample point.
Definition: PointFittingKernel.hpp:100
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::robustEstimation::PointFittingKernel::_kernelSolver
const SolverT _kernelSolver
two view solver
Definition: PointFittingKernel.hpp:119
aliceVision::robustEstimation::PointFittingKernel::getMinimumNbRequiredSamples
std::size_t getMinimumNbRequiredSamples() const
Return the minimum number of required samples.
Definition: PointFittingKernel.hpp:64
aliceVision
Definition: checkerDetector.cpp:32
aliceVision::robustEstimation::PointFittingKernel::getMaximumNbModels
std::size_t getMaximumNbModels() const
Return the maximum number of models.
Definition: PointFittingKernel.hpp:70
aliceVision::robustEstimation::PointFittingKernel::nbSamples
std::size_t nbSamples() const
get the number of putative points
Definition: PointFittingKernel.hpp:111
aliceVision::robustEstimation::MatrixModel
Matrix based model to be used in a solver.
Definition: ISolver.hpp:88
aliceVision::robustEstimation::PointFittingKernel::_x2
const Mat & _x2
right corresponding data
Definition: PointFittingKernel.hpp:117
aliceVision::robustEstimation::PointFittingKernel::_errorEstimator
const ErrorT _errorEstimator
solver error estimation
Definition: PointFittingKernel.hpp:121
aliceVision::robustEstimation::PointFittingKernel::error
virtual double error(std::size_t sample, const ModelT &model) const
Return the error associated to the model and a sample point.
Definition: PointFittingKernel.hpp:90
aliceVision::robustEstimation::PointFittingKernel::_x1
const Mat & _x1
left corresponding data
Definition: PointFittingKernel.hpp:115
aliceVision::robustEstimation::NormalizedPointFittingKernel::fit
void fit(const std::vector< std::size_t > &samples, std::vector< ModelT_ > &models) const override
Extract required sample and fit model(s) to the sample.
Definition: PointFittingKernel.hpp:139
aliceVision::robustEstimation::PointFittingKernel::fit
virtual void fit(const std::vector< std::size_t > &samples, std::vector< ModelT > &models) const
Extract required sample and fit model(s) to the sample.
Definition: PointFittingKernel.hpp:77
aliceVision::robustEstimation::NormalizedPointFittingKernel
Definition: PointFittingKernel.hpp:125