Libmv: Update tests to make tests pass after recent Ceres update
[blender.git] / intern / libmv / libmv / simple_pipeline / modal_solver_test.cc
1 // Copyright (c) 2013 libmv authors.
2 //
3 // Permission is hereby granted, free of charge, to any person obtaining a copy
4 // of this software and associated documentation files (the "Software"), to
5 // deal in the Software without restriction, including without limitation the
6 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7 // sell copies of the Software, and to permit persons to whom the Software is
8 // furnished to do so, subject to the following conditions:
9 //
10 // The above copyright notice and this permission notice shall be included in
11 // all copies or substantial portions of the Software.
12 //
13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19 // IN THE SOFTWARE.
20
21 #include "libmv/simple_pipeline/modal_solver.h"
22
23 #include "testing/testing.h"
24 #include "libmv/logging/logging.h"
25 #include "libmv/simple_pipeline/bundle.h"
26 #include "libmv/simple_pipeline/camera_intrinsics.h"
27
28 #include <stdio.h>
29
30 namespace libmv {
31
32 TEST(ModalSolver, SyntheticCubeSceneMotion) {
33   double kTolerance = 1e-8;
34
35   PolynomialCameraIntrinsics intrinsics;
36   intrinsics.SetFocalLength(658.286, 658.286);
37   intrinsics.SetPrincipalPoint(480.0, 270.0);
38   intrinsics.SetRadialDistortion(0.0, 0.0, 0.0);
39
40   Marker markers[] = {
41       {1, 0, 212.172775, 354.713538, 1.0}, {2, 0, 773.468399, 358.735306, 1.0},
42       {1, 1, 62.415197, 287.905354, 1.0},  {2, 1, 619.103336, 324.402537, 1.0},
43       {1, 2, 206.847939, 237.567925, 1.0}, {2, 2, 737.496986, 247.881383, 1.0},
44       {1, 3, 351.743889, 316.415906, 1.0}, {2, 3, 908.779621, 290.703617, 1.0},
45       {1, 4, 232.941413, 54.265443, 1.0},  {2, 4, 719.444847, 63.062531, 1.0},
46       {1, 5, 96.391611, 119.283537, 1.0},  {2, 5, 611.413136, 160.890715, 1.0},
47       {1, 6, 363.444958, 150.838144, 1.0}, {2, 6, 876.374531, 114.916206, 1.0},
48     };
49   int num_markers = sizeof(markers) / sizeof(Marker);
50
51   Tracks tracks;
52   for (int i = 0; i < num_markers; i++) {
53     double x = markers[i].x, y = markers[i].y;
54     intrinsics.InvertIntrinsics(x, y, &x, &y);
55     tracks.Insert(markers[i].image, markers[i].track, x, y);
56   }
57
58   EuclideanReconstruction reconstruction;
59   ModalSolver(tracks, &reconstruction);
60   EuclideanBundleCommonIntrinsics(tracks,
61                                   BUNDLE_NO_INTRINSICS,
62                                   BUNDLE_NO_TRANSLATION,
63                                   &reconstruction,
64                                   &intrinsics,
65                                   NULL);
66
67   Mat3 expected_rotation;
68   expected_rotation << 0.98215101743472, 0.17798354937546,  0.06083777694542,
69                       -0.16875283983360, 0.97665300495333, -0.13293376908719,
70                       -0.08307742172243, 0.12029448893171,  0.98925597189636;
71
72   Mat3 &first_camera_R = reconstruction.CameraForImage(1)->R;
73   Mat3 &second_camera_R = reconstruction.CameraForImage(2)->R;
74
75   EXPECT_TRUE(Mat3::Identity().isApprox(first_camera_R, kTolerance));
76   EXPECT_TRUE(expected_rotation.isApprox(second_camera_R, kTolerance));
77 }
78
79 }  // namespace libmv