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>
19 using namespace aliceVision::trifocal::kernel;
22 template<
typename SolverT_,
typename ErrorT_,
typename ModelT_>
26 using SolverT = SolverT_;
27 using ErrorT = SolverT_;
28 using ModelT = ModelT_;
33 const std::vector<Mat3>& vec_KRi,
35 const double ThresholdUpperBound)
41 _thresholdUpperBound(ThresholdUpperBound),
42 _logalpha0(log10(M_PI)),
46 robustEstimation::applyTransformationToPoints(_x1, _Kinv, &_x1n);
47 robustEstimation::applyTransformationToPoints(_x2, _Kinv, &_x2n);
48 robustEstimation::applyTransformationToPoints(_x3, _Kinv, &_x3n);
50 _vecKR[0] = _Kinv * _vecKR[0];
51 _vecKR[1] = _Kinv * _vecKR[1];
52 _vecKR[2] = _Kinv * _vecKR[2];
64 inline std::size_t
getMaximumNbModels()
const override {
return _kernelSolver.getMaximumNbModels(); }
66 void fit(
const std::vector<std::size_t>& samples, std::vector<ModelT_>& models)
const override
79 double error(std::size_t sample,
const ModelT_& model)
const override
81 return _errorEstimator.error(model, _x1n.col(sample), _x2n.col(sample), _x3n.col(sample));
84 void errors(
const ModelT_& model, std::vector<double>& errors)
const override
86 for (std::size_t sample = 0; sample < _x1n.cols(); ++sample)
87 errors[sample] = error(sample, model);
90 std::size_t nbSamples()
const override {
return _x1n.cols(); }
95 model.P1 = _K * model.P1;
96 model.P2 = _K * model.P2;
97 model.P3 = _K * model.P3;
100 double logalpha0()
const override {
return _logalpha0; }
102 double errorVectorDimension()
const override {
return 2.0; }
104 Mat3 normalizer1()
const override {
return _Kinv; }
106 double thresholdNormalizer()
const override {
return 1.0; }
108 double unormalizeError(
double val)
const override {
return std::sqrt(val) / _Kinv(0, 0); }
110 std::size_t getMinimumNbRequiredSamplesLS()
const
112 throw std::logic_error(
"TranslationTripletKernelACRansac cannot be used in LO_RANSAC.");
116 void fitLS(
const std::vector<std::size_t>& inliers, std::vector<ModelT>& models,
const std::vector<double>* weights =
nullptr)
const
118 throw std::logic_error(
"TranslationTripletKernelACRansac cannot be used in LO_RANSAC.");
121 void computeWeights(
const ModelT& model,
const std::vector<std::size_t>& inliers, std::vector<double>& weights,
const double eps = 0.001)
const
123 throw std::logic_error(
"TranslationTripletKernelACRansac cannot be used in LO_RANSAC.");
133 const Mat3 _Kinv, _K;
134 const double _logalpha0;
135 const double _thresholdUpperBound;
136 std::vector<Mat3> _vecKR;
139 const SolverT _kernelSolver = SolverT();
141 const ErrorT _errorEstimator = ErrorT();