Skip to content

Commit 4456b5b

Browse files
authored
Merge pull request #625 from mapillary/fix-pybind-clang
fix: pybing+CLANG
2 parents 7cd27cb + e7fc35d commit 4456b5b

4 files changed

Lines changed: 34 additions & 50 deletions

File tree

opensfm/reconstruction.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -553,7 +553,7 @@ def two_view_reconstruction(p1, p2, camera1, camera2,
553553

554554
if inliers.sum() > 5:
555555
T = multiview.relative_pose_optimize_nonlinear(b1[inliers],
556-
b2[inliers],
556+
b2[inliers],
557557
t, R,
558558
iterations)
559559
R = T[:, :3]
@@ -876,7 +876,7 @@ def triangulate_robust(self, track, reproj_threshold, min_ray_angle_degrees):
876876
e, X = pygeometry.triangulate_bearings_midpoint(
877877
os_t, bs_t, thresholds, np.radians(min_ray_angle_degrees))
878878

879-
if X is not None:
879+
if e:
880880
reprojected_bs = X-os
881881
reprojected_bs /= np.linalg.norm(reprojected_bs, axis=1)[:, np.newaxis]
882882
inliers = np.linalg.norm(reprojected_bs - bs, axis=1) < reproj_threshold
@@ -915,7 +915,7 @@ def triangulate(self, track, reproj_threshold, min_ray_angle_degrees):
915915
thresholds = len(os) * [reproj_threshold]
916916
e, X = pygeometry.triangulate_bearings_midpoint(
917917
os, bs, thresholds, np.radians(min_ray_angle_degrees))
918-
if X is not None:
918+
if e:
919919
point = types.Point()
920920
point.id = track
921921
point.coordinates = X.tolist()
@@ -937,7 +937,7 @@ def triangulate_dlt(self, track, reproj_threshold, min_ray_angle_degrees):
937937
if len(Rts) >= 2:
938938
e, X = pygeometry.triangulate_bearings_dlt(
939939
Rts, bs, reproj_threshold, np.radians(min_ray_angle_degrees))
940-
if X is not None:
940+
if e:
941941
point = types.Point()
942942
point.id = track
943943
point.coordinates = X.tolist()
@@ -1317,7 +1317,7 @@ def incremental_reconstruction(data, tracks_manager):
13171317
chrono = Chronometer()
13181318

13191319
images = tracks_manager.get_shot_ids()
1320-
1320+
13211321
if not data.reference_lla_exists():
13221322
data.invent_reference_lla(images)
13231323

opensfm/src/geometry/src/triangulation.cc

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11

22
#include <geometry/triangulation.h>
33

4-
namespace geometry {
5-
64
double 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-
2112
Eigen::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

7871
std::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> &centers,
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> &centers,
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> &cente
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> &cente
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

opensfm/src/geometry/triangulation.h

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,12 @@
99
#include <string>
1010
#include <foundation/python_types.h>
1111

12-
namespace geometry {
13-
14-
enum {
15-
TRIANGULATION_OK = 0,
16-
TRIANGULATION_SMALL_ANGLE,
17-
TRIANGULATION_BEHIND_CAMERA,
18-
TRIANGULATION_BAD_REPROJECTION
19-
};
20-
2112
double AngleBetweenVectors(const Eigen::Vector3d &u, const Eigen::Vector3d &v);
2213

23-
py::list TriangulateReturn(int error, py::object value);
24-
2514
Eigen::Vector4d TriangulateBearingsDLTSolve(
2615
const Eigen::Matrix<double, -1, 3> &bs,
2716
const std::vector< Eigen::Matrix<double, 3, 4> > &Rts);
2817

29-
py::object TriangulateBearingsDLT(const std::vector<Eigen::Matrix<double, 3, 4>> &Rts,
30-
const Eigen::Matrix<double, -1, 3> &bearings,
31-
double threshold,
32-
double min_angle);
33-
3418
// Point minimizing the squared distance to all rays
3519
// Closed for solution from
3620
// Srikumar Ramalingam, Suresh K. Lodha and Peter Sturm
@@ -59,6 +43,13 @@ Eigen::Matrix<T, 3, 1> TriangulateBearingsMidpointSolve(
5943
return (Eigen::Matrix<T, 3, 3>::Identity() + BBt * Cinv) * A / T(nviews) - Cinv * BBtA;
6044
}
6145

46+
namespace geometry {
47+
48+
std::pair<bool, Eigen::Vector3d> TriangulateBearingsDLT(
49+
const std::vector<Eigen::Matrix<double, 3, 4>> &Rts,
50+
const Eigen::Matrix<double, -1, 3> &bearings, double threshold,
51+
double min_angle);
52+
6253
template< class T >
6354
Eigen::Matrix<T, 3, 1> TriangulateTwoBearingsMidpointSolve(
6455
const Eigen::Matrix<T, 2, 3> &centers,
@@ -85,9 +76,9 @@ std::vector<Eigen::Vector3d> TriangulateTwoBearingsMidpointMany(
8576
const Eigen::Matrix3d& rotation,
8677
const Eigen::Vector3d& translation);
8778

88-
py::object TriangulateBearingsMidpoint(const Eigen::Matrix<double, -1, 3> &centers,
89-
const Eigen::Matrix<double, -1, 3> &bearings,
90-
const std::vector<double> &threshold_list,
91-
double min_angle);
79+
std::pair<bool, Eigen::Vector3d> TriangulateBearingsMidpoint(
80+
const Eigen::Matrix<double, -1, 3> &centers,
81+
const Eigen::Matrix<double, -1, 3> &bearings,
82+
const std::vector<double> &threshold_list, double min_angle);
9283

9384
} // namespace geometry

opensfm/test/test_triangulation.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def test_triangulate_bearings_dlt():
6262
res, X = pygeometry.triangulate_bearings_dlt(
6363
[rt1, rt2], [b1, b2], max_reprojection, min_ray_angle)
6464
assert np.allclose(X, [0, 0, 1.0])
65-
assert res == 0
65+
assert res is True
6666

6767

6868
def test_triangulate_bearings_midpoint():
@@ -75,7 +75,7 @@ def test_triangulate_bearings_midpoint():
7575
res, X = pygeometry.triangulate_bearings_midpoint(
7676
[o1, o2], [b1, b2], 2 * [max_reprojection], min_ray_angle)
7777
assert np.allclose(X, [0, 0, 1.0])
78-
assert res == 0
78+
assert res is True
7979

8080

8181
def test_triangulate_two_bearings_midpoint():

0 commit comments

Comments
 (0)