11 #include <aliceVision/numeric/numeric.hpp>
12 #include <aliceVision/robustEstimation/ISolver.hpp>
13 #include <aliceVision/numeric/algebra.hpp>
33 void TriangulateNView(
const Mat2X& x,
const std::vector<Mat34>& Ps, Vec4& X,
const std::vector<double>* weights =
nullptr);
48 template<
class ContainerT>
49 void TriangulateNViewAlgebraic(
const ContainerT& x,
const std::vector<Mat34>& Ps, Vec4& X,
const std::vector<double>* weights =
nullptr)
52 Mat2X::Index nviews = CountElements(x);
53 assert(
static_cast<std::size_t
>(nviews) == Ps.size());
55 Mat design(2 * nviews, 4);
56 for (Mat2X::Index i = 0; i < nviews; ++i)
58 design.block<2, 4>(2 * i, 0) =
SkewMatMinimal(getElement<ContainerT>(x, i)) * Ps[i];
59 if (weights !=
nullptr)
61 design.block<2, 4>(2 * i, 0) *= (*weights)[i];
79 void TriangulateNViewAlgebraicSpherical(
const std::vector<Vec3> &xs,
80 const std::vector<Eigen::Matrix4d> & Ts,
82 const std::vector<double> *weights =
nullptr);
96 void TriangulateNViewLORANSAC(
const std::vector<Vec2>& x,
97 const std::vector<Mat34>& Ps,
98 std::mt19937& generator,
100 std::vector<std::size_t>* inliersIndex = NULL,
101 const double& thresholdError = 4.0);
108 std::size_t size()
const {
return views.size(); }
110 void clear() { views.clear(); }
112 void add(
const Mat34& projMatrix,
const Vec2& p) { views.emplace_back(projMatrix, p); }
115 double error(
const Vec3& X)
const;
117 Vec3 compute(
int iter = 3)
const;
123 double minDepth()
const {
return zmin; }
124 double maxDepth()
const {
return zmax; }
125 double error()
const {
return err; }
134 std::vector<std::pair<Mat34, Vec2>> views;
137 template<
class ContainerT>
155 TriangulateNViewAlgebraic(x, Ps, pt3d);
157 assert(X.size() == 1);
160 void solve(
const ContainerT& x,
161 const std::vector<Mat34>& Ps,
163 const std::vector<double>& weights)
const
166 TriangulateNViewAlgebraic(x, Ps, pt3d, &weights);
168 assert(X.size() == 1);
195 TriangulateNViewAlgebraicSpherical(x, Ts, pt3d);
197 assert(X.size() == 1);
202 void solve(
const std::vector<Vec3> & x,
const std::vector<Eigen::Matrix4d>& Ts, std::vector<
robustEstimation::MatrixModel<Vec4>>& X,
const std::vector<double>& weights)
const
205 TriangulateNViewAlgebraicSpherical(x, Ts, pt3d, &weights);
207 assert(X.size() == 1);