6 #include <aliceVision/robustEstimation/ISolver.hpp>
7 #include <aliceVision/robustEstimation/IRansacKernel.hpp>
29 const std::vector<Vec2> & observations,
30 const std::vector<double> & weights,
31 const std::vector<Eigen::Matrix4d>& poses,
32 std::vector<std::shared_ptr<camera::IntrinsicBase>> & intrinsics
35 , _intrinsics(intrinsics)
38 for (
int id = 0;
id < observations.size();
id++)
41 const Vec2 & obs = observations[id];
42 std::shared_ptr<camera::IntrinsicBase> camera = _intrinsics[id];
44 _observations.push_back(camera->getUndistortedPixel(obs));
45 _lifted.push_back(camera->toUnitSphere(camera->removeDistortion(camera->ima2cam(obs))));
67 inline std::size_t getMinimumNbRequiredSamplesLS()
const override
77 void fit(
const std::vector<std::size_t>& samples, std::vector<ModelT>& models)
const override
79 std::vector<Vec3> sampledPts;
80 std::vector<Eigen::Matrix4d> sampledMats;
82 for (
int i = 0; i < samples.size(); i++)
84 std::size_t idx = samples[i];
85 sampledMats.push_back(_poses[idx]);
86 sampledPts.push_back(_lifted[idx]);
89 _solver.solve(sampledPts, sampledMats, models);
98 void fitLS(
const std::vector<std::size_t>& inliers,
99 std::vector<ModelT>& models,
100 const std::vector<double> *weights =
nullptr)
const override
102 std::vector<Vec3> sampledPts;
103 std::vector<Eigen::Matrix4d> sampledMats;
105 for (
int i = 0; i < inliers.size(); i++)
107 std::size_t idx = inliers[i];
108 sampledMats.push_back(_poses[idx]);
109 sampledPts.push_back(_lifted[idx]);
112 if(weights !=
nullptr)
113 _solver.solve(sampledPts, sampledMats, models, *weights);
115 _solver.solve(sampledPts, sampledMats, models);
128 const std::vector<std::size_t> &inliers,
129 std::vector<double>& weights,
130 const double eps = 0.001)
const override
132 const auto numInliers = inliers.size();
133 weights.resize(numInliers);
135 for(std::size_t sample = 0; sample < numInliers; ++sample)
137 const auto idx = inliers[sample];
138 weights[sample] = 1.0 / std::pow(std::max(eps,
error(idx, model)), 2);
148 double error(std::size_t sample,
const ModelT & model)
const override
150 Vec4 X = model.getMatrix();
151 if (std::abs(X(3)) > 1e-16)
156 double w = _weights[sample];
158 Vec2 residual = _intrinsics[sample]->residual(_poses[sample], X, _observations[sample],
false);
160 return residual.norm() * w;
171 for(Mat::Index i = 0; i < _lifted.size(); ++i)
192 return _lifted.size();
195 double logalpha0()
const override
197 std::runtime_error(
"Method 'logalpha0()' is not defined for 'NViewsTriangulationLORansac'.");
201 double errorVectorDimension()
const override
203 std::runtime_error(
"Method 'errorVectorDimension()' is not defined for 'NViewsTriangulationLORansac'.");
207 double unormalizeError(
double val)
const override
209 std::runtime_error(
"Method 'unormalizeError()' is not defined for 'NViewsTriangulationLORansac'.");
213 Mat3 normalizer1()
const override
215 std::runtime_error(
"Method 'normalizer1()' is not defined for 'NViewsTriangulationLORansac'.");
219 double thresholdNormalizer()
const override
221 std::runtime_error(
"Method 'thresholdNormalizer()' is not defined for 'NViewsTriangulationLORansac'.");
226 std::vector<Vec3> _lifted;
227 std::vector<Vec2> _observations;
228 std::vector<double> _weights;
229 const std::vector<Eigen::Matrix4d> _poses;
230 const std::vector<std::shared_ptr<camera::IntrinsicBase>> _intrinsics;
231 multiview::TriangulateNViewsSphericalSolver _solver;