32 #define TEST_NAME "base/homography_matrix"
37 #include <Eigen/Geometry>
46 H << 2.649157564634028, 4.583875997496426, 70.694447785121326,
47 -1.072756858861583, 3.533262150437228, 1513.656999614321649,
48 0.001303887589576, 0.003042206876298, 1;
52 K << 640, 0, 320, 0, 640, 240, 0, 0, 1;
54 std::vector<Eigen::Matrix3d> R;
55 std::vector<Eigen::Vector3d> t;
56 std::vector<Eigen::Vector3d> n;
59 BOOST_CHECK_EQUAL(R.size(), 4);
60 BOOST_CHECK_EQUAL(t.size(), 4);
61 BOOST_CHECK_EQUAL(n.size(), 4);
63 Eigen::Matrix3d R_ref;
64 R_ref << 0.43307983549125, 0.545749113549648, -0.717356090899523,
65 -0.85630229674426, 0.497582023798831, -0.138414255706431,
66 0.281404038139784, 0.67421809131173, 0.682818960388909;
67 const Eigen::Vector3d t_ref(1.826751712278038, 1.264718492450820,
69 const Eigen::Vector3d n_ref(-0.244875830334816, -0.480857890778889,
72 bool ref_solution_exists =
false;
73 for (
size_t i = 0; i < 4; ++i) {
74 const double kEps = 1
e-6;
75 if ((R[i] - R_ref).norm() < kEps && (t[i] - t_ref).norm() < kEps &&
76 (n[i] - n_ref).norm() < kEps) {
77 ref_solution_exists =
true;
80 BOOST_CHECK(ref_solution_exists);
84 const int numIters = 100;
86 const double epsilon = 1
e-6;
88 const Eigen::Matrix3d id3 = Eigen::Matrix3d::Identity();
90 for (
int i = 0; i < numIters; ++i) {
91 const Eigen::Matrix3d H = Eigen::Matrix3d::Random();
93 if (std::abs(H.determinant()) < epsilon) {
97 std::vector<Eigen::Matrix3d> R;
98 std::vector<Eigen::Vector3d> t;
99 std::vector<Eigen::Vector3d> n;
102 BOOST_CHECK_EQUAL(R.size(), 4);
103 BOOST_CHECK_EQUAL(t.size(), 4);
104 BOOST_CHECK_EQUAL(n.size(), 4);
107 for (
const Eigen::Matrix3d& candidate_R : R) {
108 const Eigen::Matrix3d orthog_error =
109 candidate_R.transpose() * candidate_R - id3;
112 BOOST_CHECK_LT(orthog_error.lpNorm<Eigen::Infinity>(), epsilon);
115 BOOST_CHECK_CLOSE(candidate_R.determinant(), 1.0, epsilon);
121 const Eigen::Matrix3d K1 = Eigen::Matrix3d::Identity();
122 const Eigen::Matrix3d K2 = Eigen::Matrix3d::Identity();
123 const Eigen::Matrix3d R_ref = Eigen::Matrix3d::Identity();
124 const Eigen::Vector3d t_ref(1, 0, 0);
125 const Eigen::Vector3d n_ref(-1, 0, 0);
126 const double d_ref = 1;
127 const Eigen::Matrix3d H =
130 std::vector<Eigen::Vector2d> points1;
131 points1.emplace_back(0.1, 0.4);
132 points1.emplace_back(0.2, 0.3);
133 points1.emplace_back(0.3, 0.2);
134 points1.emplace_back(0.4, 0.1);
136 std::vector<Eigen::Vector2d> points2;
137 for (
const auto& point1 : points1) {
138 const Eigen::Vector3d point2 = H * point1.homogeneous();
139 points2.push_back(point2.hnormalized());
145 std::vector<Eigen::Vector3d> points3D;
148 BOOST_CHECK_EQUAL(R, R_ref);
149 BOOST_CHECK_EQUAL(t, t_ref);
150 BOOST_CHECK_EQUAL(n, n_ref);
151 BOOST_CHECK_EQUAL(points3D.size(), points1.size());
155 const Eigen::Matrix3d K1 = Eigen::Matrix3d::Identity();
156 const Eigen::Matrix3d K2 = Eigen::Matrix3d::Identity();
157 const Eigen::Matrix3d R = Eigen::Matrix3d::Identity();
158 const Eigen::Vector3d t(0, 0, 0);
159 const Eigen::Vector3d n(-1, 0, 0);
162 BOOST_CHECK_EQUAL(H, Eigen::Matrix3d::Identity());
166 const Eigen::Matrix3d K1 = Eigen::Matrix3d::Identity();
167 const Eigen::Matrix3d K2 = Eigen::Matrix3d::Identity();
168 const Eigen::Matrix3d R = Eigen::Matrix3d::Identity();
169 const Eigen::Vector3d t(1, 0, 0);
170 const Eigen::Vector3d n(-1, 0, 0);
173 Eigen::Matrix3d H_ref;
174 H_ref << 2, 0, 0, 0, 1, 0, 0, 0, 1;
175 BOOST_CHECK_EQUAL(H, H_ref);
BOOST_AUTO_TEST_CASE(TestDecomposeHomographyMatrix)
void PoseFromHomographyMatrix(const Eigen::Matrix3d &H, const Eigen::Matrix3d &K1, const Eigen::Matrix3d &K2, const std::vector< Eigen::Vector2d > &points1, const std::vector< Eigen::Vector2d > &points2, Eigen::Matrix3d *R, Eigen::Vector3d *t, Eigen::Vector3d *n, std::vector< Eigen::Vector3d > *points3D)
Eigen::Matrix3d HomographyMatrixFromPose(const Eigen::Matrix3d &K1, const Eigen::Matrix3d &K2, const Eigen::Matrix3d &R, const Eigen::Vector3d &t, const Eigen::Vector3d &n, const double d)
void DecomposeHomographyMatrix(const Eigen::Matrix3d &H, const Eigen::Matrix3d &K1, const Eigen::Matrix3d &K2, std::vector< Eigen::Matrix3d > *R, std::vector< Eigen::Vector3d > *t, std::vector< Eigen::Vector3d > *n)