10 #include "aliceVision/numeric/numeric.hpp"
11 #include "aliceVision/config.hpp"
13 #include "aliceVision/numeric/projection.hpp"
14 #include "aliceVision/robustEstimation/conditioning.hpp"
15 #include "aliceVision/multiview/triangulation/Triangulation.hpp"
18 #include "aliceVision/linearProgramming/ISolver.hpp"
19 #include "aliceVision/linearProgramming/OSIXSolver.hpp"
20 #if ALICEVISION_IS_DEFINED(ALICEVISION_HAVE_MOSEK)
21 #include "aliceVision/linearProgramming/MOSEKSolver.hpp"
24 #include "aliceVision/linearProgramming/bisectionLP.hpp"
25 #include "aliceVision/linearProgramming/lInfinityCV/tijsAndXis_From_xi_Ri.hpp"
36 static double Error(
const TrifocalTensorModel& t,
const Vec2& pt1,
const Vec2& pt2,
const Vec2& pt3)
40 triangulationObj.add(t.P1, pt1);
41 triangulationObj.add(t.P2, pt2);
42 triangulationObj.add(t.P3, pt3);
43 const Vec3 X = triangulationObj.compute();
46 const double pt1ReProj = (
project(t.P1, X) - pt1).squaredNorm();
47 const double pt2ReProj = (
project(t.P2, X) - pt2).squaredNorm();
48 const double pt3ReProj = (
project(t.P3, X) - pt3).squaredNorm();
50 return std::max(pt1ReProj, std::max(pt2ReProj, pt3ReProj));
60 using namespace aliceVision::trifocal::kernel;
81 const std::vector<Mat3>& vec_KR,
82 std::vector<TrifocalTensorModel>& P,
83 const double ThresholdUpperBound)
const
86 const int n_obs = pt0.cols();
87 Mat4X megaMat(4, n_obs * 3);
90 for (
size_t i = 0; i < n_obs; ++i)
92 megaMat.col(cpt++) << pt0.col(i)(0), pt0.col(i)(1), (
double)i, 0.0;
93 megaMat.col(cpt++) << pt1.col(i)(0), pt1.col(i)(1), (
double)i, 1.0;
94 megaMat.col(cpt++) << pt2.col(i)(0), pt2.col(i)(1), (
double)i, 2.0;
98 std::vector<double> vec_solution((3 + getMinimumNbRequiredSamples()) * 3);
100 using namespace aliceVision::lInfinityCV;
102 #if ALICEVISION_IS_DEFINED(ALICEVISION_HAVE_MOSEK)
103 MOSEKSolver LPsolver(
static_cast<int>(vec_solution.size()));
105 OSI_CISolverWrapper LPsolver(
static_cast<int>(vec_solution.size()));
110 if (BisectionLP<Translation_Structure_L1_ConstraintBuilder, LPConstraintsSparse>(
111 LPsolver, cstBuilder, &vec_solution, ThresholdUpperBound, 0.0, 1e-8, 2, &gamma,
false))
113 const std::vector<Vec3> vec_tis = {Vec3(vec_solution[0], vec_solution[1], vec_solution[2]),
114 Vec3(vec_solution[3], vec_solution[4], vec_solution[5]),
115 Vec3(vec_solution[6], vec_solution[7], vec_solution[8])};
118 PTemp.P1 = HStack(vec_KR[0], vec_tis[0]);
119 PTemp.P2 = HStack(vec_KR[1], vec_tis[1]);
120 PTemp.P3 = HStack(vec_KR[2], vec_tis[2]);
127 static double error(
const TrifocalTensorModel& Tensor,
const Vec2& pt0,
const Vec2& pt1,
const Vec2& pt2)
129 return TrifocalTensorModel::Error(Tensor, pt0, pt1, pt2);