39 std::vector<Eigen::Vector2d>* normed_points,
40 Eigen::Matrix3d* matrix) {
42 Eigen::Vector2d centroid(0, 0);
43 for (
const Eigen::Vector2d& point :
points) {
49 double rms_mean_dist = 0;
50 for (
const Eigen::Vector2d& point :
points) {
51 rms_mean_dist += (point - centroid).squaredNorm();
53 rms_mean_dist = std::sqrt(rms_mean_dist /
points.size());
56 const double norm_factor = std::sqrt(2.0) / rms_mean_dist;
57 *matrix << norm_factor, 0, -norm_factor * centroid(0), 0, norm_factor,
58 -norm_factor * centroid(1), 0, 0, 1;
61 normed_points->resize(
points.size());
63 const double M_00 = (*matrix)(0, 0);
64 const double M_01 = (*matrix)(0, 1);
65 const double M_02 = (*matrix)(0, 2);
66 const double M_10 = (*matrix)(1, 0);
67 const double M_11 = (*matrix)(1, 1);
68 const double M_12 = (*matrix)(1, 2);
69 const double M_20 = (*matrix)(2, 0);
70 const double M_21 = (*matrix)(2, 1);
71 const double M_22 = (*matrix)(2, 2);
73 for (
size_t i = 0; i <
points.size(); ++i) {
74 const double p_0 =
points[i](0);
75 const double p_1 =
points[i](1);
77 const double np_0 = M_00 * p_0 + M_01 * p_1 + M_02;
78 const double np_1 = M_10 * p_0 + M_11 * p_1 + M_12;
79 const double np_2 = M_20 * p_0 + M_21 * p_1 + M_22;
81 const double inv_np_2 = 1.0 / np_2;
82 (*normed_points)[i](0) = np_0 * inv_np_2;
83 (*normed_points)[i](1) = np_1 * inv_np_2;
88 const std::vector<Eigen::Vector2d>& points2,
89 const Eigen::Matrix3d& E,
90 std::vector<double>* residuals) {
91 CHECK_EQ(points1.size(), points2.size());
93 residuals->resize(points1.size());
98 const double E_00 = E(0, 0);
99 const double E_01 = E(0, 1);
100 const double E_02 = E(0, 2);
101 const double E_10 = E(1, 0);
102 const double E_11 = E(1, 1);
103 const double E_12 = E(1, 2);
104 const double E_20 = E(2, 0);
105 const double E_21 = E(2, 1);
106 const double E_22 = E(2, 2);
108 for (
size_t i = 0; i < points1.size(); ++i) {
109 const double x1_0 = points1[i](0);
110 const double x1_1 = points1[i](1);
111 const double x2_0 = points2[i](0);
112 const double x2_1 = points2[i](1);
115 const double Ex1_0 = E_00 * x1_0 + E_01 * x1_1 + E_02;
116 const double Ex1_1 = E_10 * x1_0 + E_11 * x1_1 + E_12;
117 const double Ex1_2 = E_20 * x1_0 + E_21 * x1_1 + E_22;
120 const double Etx2_0 = E_00 * x2_0 + E_10 * x2_1 + E_20;
121 const double Etx2_1 = E_01 * x2_0 + E_11 * x2_1 + E_21;
124 const double x2tEx1 = x2_0 * Ex1_0 + x2_1 * Ex1_1 + Ex1_2;
129 (Ex1_0 * Ex1_0 + Ex1_1 * Ex1_1 + Etx2_0 * Etx2_0 + Etx2_1 * Etx2_1);
134 const std::vector<Eigen::Vector2d>& points2D,
135 const std::vector<Eigen::Vector3d>& points3D,
137 CHECK_EQ(points2D.size(), points3D.size());
139 residuals->resize(points2D.size());
144 const double P_00 = proj_matrix(0, 0);
145 const double P_01 = proj_matrix(0, 1);
146 const double P_02 = proj_matrix(0, 2);
147 const double P_03 = proj_matrix(0, 3);
148 const double P_10 = proj_matrix(1, 0);
149 const double P_11 = proj_matrix(1, 1);
150 const double P_12 = proj_matrix(1, 2);
151 const double P_13 = proj_matrix(1, 3);
152 const double P_20 = proj_matrix(2, 0);
153 const double P_21 = proj_matrix(2, 1);
154 const double P_22 = proj_matrix(2, 2);
155 const double P_23 = proj_matrix(2, 3);
157 for (
size_t i = 0; i < points2D.size(); ++i) {
158 const double X_0 = points3D[i](0);
159 const double X_1 = points3D[i](1);
160 const double X_2 = points3D[i](2);
163 const double px_2 = P_20 * X_0 + P_21 * X_1 + P_22 * X_2 + P_23;
166 if (px_2 > std::numeric_limits<double>::epsilon()) {
167 const double px_0 = P_00 * X_0 + P_01 * X_1 + P_02 * X_2 + P_03;
168 const double px_1 = P_10 * X_0 + P_11 * X_1 + P_12 * X_2 + P_13;
170 const double x_0 = points2D[i](0);
171 const double x_1 = points2D[i](1);
173 const double inv_px_2 = 1.0 / px_2;
174 const double dx_0 = x_0 - px_0 * inv_px_2;
175 const double dx_1 = x_1 - px_1 * inv_px_2;
177 (*residuals)[i] = dx_0 * dx_0 + dx_1 * dx_1;
179 (*residuals)[i] = std::numeric_limits<double>::max();
Matrix< double, 3, 4 > Matrix3x4d
void CenterAndNormalizeImagePoints(const std::vector< Eigen::Vector2d > &points, std::vector< Eigen::Vector2d > *normed_points, Eigen::Matrix3d *matrix)
void ComputeSquaredReprojectionError(const std::vector< Eigen::Vector2d > &points2D, const std::vector< Eigen::Vector3d > &points3D, const Eigen::Matrix3x4d &proj_matrix, std::vector< double > *residuals)
void ComputeSquaredSampsonError(const std::vector< Eigen::Vector2d > &points1, const std::vector< Eigen::Vector2d > &points2, const Eigen::Matrix3d &E, std::vector< double > *residuals)