32 #define TEST_NAME "base/essential_matrix"
35 #include <Eigen/Geometry>
45 const Eigen::Vector3d t = Eigen::Vector3d(0.5, 1, 1).normalized();
53 BOOST_CHECK((R1 - R).norm() < 1
e-10 || (R2 - R).norm() < 1
e-10);
54 BOOST_CHECK((tt - t).norm() < 1
e-10 || (tt + t).norm() < 1
e-10);
60 Eigen::Vector3d(0, 0, 1)),
61 (Eigen::MatrixXd(3, 3) << 0, -1, 0, 1, 0, 0, 0, 0, 0).finished());
64 Eigen::Vector3d(0, 0, 2)),
65 (Eigen::MatrixXd(3, 3) << 0, -1, 0, 1, 0, 0, 0, 0, 0).finished());
71 const Eigen::Vector3d t1(0, 0, 0);
72 const Eigen::Vector3d t2 = Eigen::Vector3d(0.5, 1, 1).normalized();
78 BOOST_CHECK_CLOSE((E1 - E2).norm(), 0, 1
e-6);
83 const Eigen::Vector3d t = Eigen::Vector3d(1, 0, 0).normalized();
89 std::vector<Eigen::Vector3d> points3D(4);
90 points3D[0] = Eigen::Vector3d(0, 0, 1);
91 points3D[1] = Eigen::Vector3d(0, 0.1, 1);
92 points3D[2] = Eigen::Vector3d(0.1, 0, 1);
93 points3D[3] = Eigen::Vector3d(0.1, 0.1, 1);
95 std::vector<Eigen::Vector2d> points1(4);
96 std::vector<Eigen::Vector2d> points2(4);
97 for (
size_t i = 0; i < points3D.size(); ++i) {
98 const Eigen::Vector3d point1 = proj_matrix1 * points3D[i].homogeneous();
99 points1[i] = point1.hnormalized();
100 const Eigen::Vector3d point2 = proj_matrix2 * points3D[i].homogeneous();
101 points2[i] = point2.hnormalized();
110 BOOST_CHECK_EQUAL(points3D.size(), 4);
112 BOOST_CHECK(RR.isApprox(R));
113 BOOST_CHECK(tt.isApprox(t));
118 const Eigen::Vector3d t = Eigen::Vector3d(1, 0, 0).normalized();
124 std::vector<Eigen::Vector3d> points3D(4);
125 points3D[0] = Eigen::Vector3d(0, 0, 1);
126 points3D[1] = Eigen::Vector3d(0, 0.1, 1);
127 points3D[2] = Eigen::Vector3d(0.1, 0, 1);
128 points3D[3] = Eigen::Vector3d(0.1, 0.1, 1);
131 for (
size_t i = 0; i < points3D.size(); ++i) {
132 const Eigen::Vector3d point1_homogeneous =
133 proj_matrix1 * points3D[i].homogeneous();
134 const Eigen::Vector2d point1 = point1_homogeneous.hnormalized();
135 const Eigen::Vector3d point2_homogeneous =
136 proj_matrix2 * points3D[i].homogeneous();
137 const Eigen::Vector2d point2 = point2_homogeneous.hnormalized();
138 Eigen::Vector2d optimal_point1;
139 Eigen::Vector2d optimal_point2;
142 BOOST_CHECK(point1.isApprox(optimal_point1));
143 BOOST_CHECK(point2.isApprox(optimal_point2));
149 const Eigen::Vector3d t = Eigen::Vector3d(0, 0, -1).normalized();
154 BOOST_CHECK(left_epipole.isApprox(Eigen::Vector3d(0, 0, 1)));
155 BOOST_CHECK(right_epipole.isApprox(Eigen::Vector3d(0, 0, 1)));
159 for (
size_t i = 1; i < 10; ++i) {
161 const Eigen::Vector3d t = Eigen::Vector3d(0, 0, i).normalized();
163 const Eigen::Matrix3d inv_inv_E =
165 BOOST_CHECK(E.isApprox(inv_inv_E));
171 const Eigen::Vector3d t = Eigen::Vector3d(1, 0, 0).normalized();
177 std::vector<Eigen::Vector3d> points3D(150);
178 for (
size_t i = 0; i < points3D.size() / 3; ++i) {
179 points3D[3 * i + 0] = Eigen::Vector3d(i * 0.01, 0, 1);
180 points3D[3 * i + 1] = Eigen::Vector3d(0, i * 0.01, 1);
181 points3D[3 * i + 2] = Eigen::Vector3d(i * 0.01, i * 0.01, 1);
184 std::vector<Eigen::Vector2d> points1(points3D.size());
185 std::vector<Eigen::Vector2d> points2(points3D.size());
186 for (
size_t i = 0; i < points3D.size(); ++i) {
187 const Eigen::Vector3d point1 = proj_matrix1 * points3D[i].homogeneous();
188 points1[i] = point1.hnormalized();
189 const Eigen::Vector3d point2 = proj_matrix2 * points3D[i].homogeneous();
190 points2[i] = point2.hnormalized();
194 const Eigen::Vector3d t_pertubated =
195 Eigen::Vector3d(1.02, 0.02, 0.02).normalized();
196 const Eigen::Matrix3d E_pertubated =
199 Eigen::Matrix3d E_refined = E_pertubated;
200 ceres::Solver::Options options;
202 std::vector<char>(points1.size(),
true), &E_refined);
204 BOOST_CHECK_LE((E - E_refined).norm(), (E - E_pertubated).norm());
BOOST_AUTO_TEST_CASE(TestDecomposeEssentialMatrix)
Matrix< double, 3, 4 > Matrix3x4d
Eigen::Matrix3d InvertEssentialMatrix(const Eigen::Matrix3d &E)
Eigen::Matrix3d EulerAnglesToRotationMatrix(const double rx, const double ry, const double rz)
Eigen::Matrix3d EssentialMatrixFromAbsolutePoses(const Eigen::Matrix3x4d &proj_matrix1, const Eigen::Matrix3x4d &proj_matrix2)
void FindOptimalImageObservations(const Eigen::Matrix3d &E, const Eigen::Vector2d &point1, const Eigen::Vector2d &point2, Eigen::Vector2d *optimal_point1, Eigen::Vector2d *optimal_point2)
Eigen::Matrix3d EssentialMatrixFromPose(const Eigen::Matrix3d &R, const Eigen::Vector3d &t)
void DecomposeEssentialMatrix(const Eigen::Matrix3d &E, Eigen::Matrix3d *R1, Eigen::Matrix3d *R2, Eigen::Vector3d *t)
Eigen::Vector3d EpipoleFromEssentialMatrix(const Eigen::Matrix3d &E, const bool left_image)
void PoseFromEssentialMatrix(const Eigen::Matrix3d &E, const std::vector< Eigen::Vector2d > &points1, const std::vector< Eigen::Vector2d > &points2, Eigen::Matrix3d *R, Eigen::Vector3d *t, std::vector< Eigen::Vector3d > *points3D)
bool RefineEssentialMatrix(const ceres::Solver::Options &options, const std::vector< Eigen::Vector2d > &points1, const std::vector< Eigen::Vector2d > &points2, const std::vector< char > &inlier_mask, Eigen::Matrix3d *E)
Eigen::Matrix3x4d ComposeProjectionMatrix(const Eigen::Vector4d &qvec, const Eigen::Vector3d &tvec)