Handle SVD sign ambiguities. Fixes issue #112

release/4.3a0
cbeall3 2014-09-30 15:27:19 -04:00
parent 4fecf8a172
commit f049c45863
2 changed files with 36 additions and 0 deletions

View File

@ -1127,6 +1127,12 @@ TEST( matrix, svd2 )
svd(sampleA, U, s, V);
// take care of sign ambiguity
if (U(0, 1) > 0) {
U = -U;
V = -V;
}
EXPECT(assert_equal(expectedU,U));
EXPECT(assert_equal(expected_s,s,1e-9));
EXPECT(assert_equal(expectedV,V));
@ -1143,6 +1149,13 @@ TEST( matrix, svd3 )
Matrix expectedV = (Matrix(3, 2) << 0.,1.,0.,0.,-1.,0.);
svd(sampleAt, U, s, V);
// take care of sign ambiguity
if (U(0, 0) > 0) {
U = -U;
V = -V;
}
Matrix S = diag(s);
Matrix t = U * S;
Matrix Vt = trans(V);
@ -1176,6 +1189,17 @@ TEST( matrix, svd4 )
0.6723, 0.7403);
svd(A, U, s, V);
// take care of sign ambiguity
if (U(0, 0) < 0) {
U.col(0) = -U.col(0);
V.col(0) = -V.col(0);
}
if (U(0, 1) < 0) {
U.col(1) = -U.col(1);
V.col(1) = -V.col(1);
}
Matrix reconstructed = U * diag(s) * trans(V);
EXPECT(assert_equal(A, reconstructed, 1e-4));

View File

@ -173,6 +173,12 @@ TEST (EssentialMatrix, epipoles) {
Vector S;
gtsam::svd(E.matrix(), U, S, V);
// take care of SVD sign ambiguity
if (U(0, 2) > 0) {
U = -U;
V = -V;
}
// check rank 2 constraint
CHECK(fabs(S(2))<1e-10);
@ -186,6 +192,12 @@ TEST (EssentialMatrix, epipoles) {
Unit3 actual = E.epipole_a();
EXPECT(assert_equal(e1, actual));
// take care of SVD sign ambiguity
if (V(0, 2) < 0) {
U = -U;
V = -V;
}
// Epipole in image 2 is E.rotation().unrotate(E.direction())
Unit3 e2(V(0, 2), V(1, 2), V(2, 2));
EXPECT(assert_equal(e2, E.epipole_b()));