11
22#include < geometry/triangulation.h>
33
4- namespace geometry {
5-
64double AngleBetweenVectors (const Eigen::Vector3d &u, const Eigen::Vector3d &v) {
75 double c = (u.dot (v)) / sqrt (u.dot (u) * v.dot (v));
86 if (std::fabs (c) >= 1.0 )
@@ -11,13 +9,6 @@ double AngleBetweenVectors(const Eigen::Vector3d &u, const Eigen::Vector3d &v) {
119 return acos (c);
1210}
1311
14- py::list TriangulateReturn (int error, py::object value) {
15- py::list retn;
16- retn.append (error);
17- retn.append (value);
18- return retn;
19- }
20-
2112Eigen::Vector4d TriangulateBearingsDLTSolve (
2213 const Eigen::Matrix<double , -1 , 3 > &bearings,
2314 const std::vector<Eigen::Matrix<double , 3 , 4 > > &Rts) {
@@ -40,10 +31,12 @@ Eigen::Vector4d TriangulateBearingsDLTSolve(
4031 return worldPoint;
4132}
4233
43- py::object TriangulateBearingsDLT (const std::vector<Eigen::Matrix<double , 3 , 4 >> &Rts,
44- const Eigen::Matrix<double , -1 , 3 > &bearings,
45- double threshold,
46- double min_angle) {
34+ namespace geometry {
35+
36+ std::pair<bool , Eigen::Vector3d> TriangulateBearingsDLT (
37+ const std::vector<Eigen::Matrix<double , 3 , 4 >> &Rts,
38+ const Eigen::Matrix<double , -1 , 3 > &bearings, double threshold,
39+ double min_angle) {
4740 const int count = Rts.size ();
4841 Eigen::MatrixXd world_bearings (count, 3 );
4942 bool angle_ok = false ;
@@ -59,7 +52,7 @@ py::object TriangulateBearingsDLT(const std::vector<Eigen::Matrix<double, 3, 4>>
5952 }
6053
6154 if (!angle_ok) {
62- return TriangulateReturn (TRIANGULATION_SMALL_ANGLE, py::none ());
55+ return std::make_pair ( false , Eigen::Vector3d ());
6356 }
6457
6558 Eigen::Vector4d X = TriangulateBearingsDLTSolve (bearings, Rts);
@@ -68,11 +61,11 @@ py::object TriangulateBearingsDLT(const std::vector<Eigen::Matrix<double, 3, 4>>
6861 for (int i = 0 ; i < count; ++i) {
6962 const Eigen::Vector3d projected = Rts[i] * X;
7063 if (AngleBetweenVectors (projected, bearings.row (i)) > threshold) {
71- return TriangulateReturn (TRIANGULATION_BAD_REPROJECTION, py::none ());
64+ return std::make_pair ( false , Eigen::Vector3d ());
7265 }
7366 }
7467
75- return TriangulateReturn (TRIANGULATION_OK, foundation::py_array_from_data (X. data (), 3 ));
68+ return std::make_pair ( true , X. head < 3 >( ));
7669}
7770
7871std::vector<Eigen::Vector3d> TriangulateTwoBearingsMidpointMany (
@@ -92,10 +85,10 @@ std::vector<Eigen::Vector3d> TriangulateTwoBearingsMidpointMany(
9285 return triangulated;
9386}
9487
95- py::object TriangulateBearingsMidpoint ( const Eigen::Matrix< double , - 1 , 3 > ¢ers,
96- const Eigen::Matrix<double , -1 , 3 > &bearings ,
97- const std::vector <double >&threshold_list ,
98- double min_angle) {
88+ std::pair< bool , Eigen::Vector3d> TriangulateBearingsMidpoint (
89+ const Eigen::Matrix<double , -1 , 3 > ¢ers ,
90+ const Eigen::Matrix <double , - 1 , 3 > &bearings ,
91+ const std::vector< double > &threshold_list, double min_angle) {
9992 const int count = centers.rows ();
10093
10194 // Check angle between rays
@@ -109,7 +102,7 @@ py::object TriangulateBearingsMidpoint(const Eigen::Matrix<double, -1, 3> ¢e
109102 }
110103 }
111104 if (!angle_ok) {
112- return TriangulateReturn (TRIANGULATION_SMALL_ANGLE, py::none ());
105+ return std::make_pair ( false , Eigen::Vector3d ());
113106 }
114107
115108 // Triangulate
@@ -120,11 +113,11 @@ py::object TriangulateBearingsMidpoint(const Eigen::Matrix<double, -1, 3> ¢e
120113 const Eigen::Vector3d projected = X - centers.row (i).transpose ();
121114 const Eigen::Vector3d measured = bearings.row (i);
122115 if (AngleBetweenVectors (projected, measured) > threshold_list[i]) {
123- return TriangulateReturn (TRIANGULATION_BAD_REPROJECTION, py::none ());
116+ return std::make_pair ( false , Eigen::Vector3d ());
124117 }
125118 }
126119
127- return TriangulateReturn (TRIANGULATION_OK, foundation::py_array_from_data (X. data (), 3 ));
120+ return std::make_pair ( true , X. head < 3 >( ));
128121}
129122
130123} // namespace geometry
0 commit comments