40 const Eigen::Vector3d& tvec) {
43 proj_matrix.rightCols<1>() = tvec;
48 const Eigen::Vector3d& T) {
50 proj_matrix.leftCols<3>() = R;
51 proj_matrix.rightCols<1>() = T;
57 inv_proj_matrix.leftCols<3>() = proj_matrix.leftCols<3>().transpose();
59 return inv_proj_matrix;
63 const Eigen::JacobiSVD<Eigen::Matrix3d> svd(
64 matrix, Eigen::ComputeFullU | Eigen::ComputeFullV);
65 Eigen::Matrix3d R = svd.matrixU() * (svd.matrixV().transpose());
66 if (R.determinant() < 0.0) {
73 Eigen::Matrix3d* R, Eigen::Vector3d* T) {
80 const double det_K = RR.determinant();
83 }
else if (det_K > 0) {
89 for (
int i = 0; i < 3; ++i) {
90 if ((*K)(i, i) < 0.0) {
91 K->col(i) = -K->col(i);
92 R->row(i) = -R->row(i);
96 *T = K->triangularView<Eigen::Upper>().solve(P.col(3));
107 const Eigen::Vector3d world_point = proj_matrix * point3D.homogeneous();
112 const Eigen::Vector3d& point3D,
113 const Eigen::Vector4d& qvec,
114 const Eigen::Vector3d& tvec,
116 const Eigen::Vector3d proj_point3D =
120 if (proj_point3D.z() < std::numeric_limits<double>::epsilon()) {
121 return std::numeric_limits<double>::max();
124 const Eigen::Vector2d proj_point2D =
127 return (proj_point2D - point2D).squaredNorm();
131 const Eigen::Vector3d& point3D,
134 const double proj_z = proj_matrix.row(2).dot(point3D.homogeneous());
137 if (proj_z < std::numeric_limits<double>::epsilon()) {
138 return std::numeric_limits<double>::max();
141 const double proj_x = proj_matrix.row(0).dot(point3D.homogeneous());
142 const double proj_y = proj_matrix.row(1).dot(point3D.homogeneous());
143 const double inv_proj_z = 1.0 / proj_z;
145 const Eigen::Vector2d proj_point2D = camera.
WorldToImage(
146 Eigen::Vector2d(inv_proj_z * proj_x, inv_proj_z * proj_y));
148 return (proj_point2D - point2D).squaredNorm();
152 const Eigen::Vector3d& point3D,
153 const Eigen::Vector4d& qvec,
154 const Eigen::Vector3d& tvec,
161 const Eigen::Vector3d& point3D,
169 const Eigen::Vector3d& point3D,
170 const Eigen::Vector4d& qvec,
171 const Eigen::Vector3d& tvec) {
172 const Eigen::Vector3d ray1 = point2D.homogeneous();
174 return std::acos(ray1.normalized().transpose() * ray2.normalized());
178 const Eigen::Vector3d& point3D,
180 const Eigen::Vector3d ray1 = point2D.homogeneous();
181 const Eigen::Vector3d ray2 = proj_matrix * point3D.homogeneous();
182 return std::acos(ray1.normalized().transpose() * ray2.normalized());
186 const Eigen::Vector3d& point3D) {
187 const double proj_z = proj_matrix.row(2).dot(point3D.homogeneous());
188 return proj_z * proj_matrix.col(2).norm();
192 const Eigen::Vector3d& point3D) {
193 return proj_matrix.row(2).dot(point3D.homogeneous()) >=
194 std::numeric_limits<double>::epsilon();
Eigen::Vector2d ImageToWorld(const Eigen::Vector2d &image_point) const
Eigen::Vector2d WorldToImage(const Eigen::Vector2d &world_point) const
Matrix< double, 3, 4 > Matrix3x4d
Eigen::Vector3d ProjectionCenterFromMatrix(const Eigen::Matrix3x4d &proj_matrix)
double CalculateSquaredReprojectionError(const Eigen::Vector2d &point2D, const Eigen::Vector3d &point3D, const Eigen::Vector4d &qvec, const Eigen::Vector3d &tvec, const Camera &camera)
bool HasPointPositiveDepth(const Eigen::Matrix3x4d &proj_matrix, const Eigen::Vector3d &point3D)
Eigen::Matrix3x4d InvertProjectionMatrix(const Eigen::Matrix3x4d &proj_matrix)
void DecomposeMatrixRQ(const MatrixType &A, MatrixType *R, MatrixType *Q)
double CalculateDepth(const Eigen::Matrix3x4d &proj_matrix, const Eigen::Vector3d &point3D)
bool DecomposeProjectionMatrix(const Eigen::Matrix3x4d &P, Eigen::Matrix3d *K, Eigen::Matrix3d *R, Eigen::Vector3d *T)
Eigen::Matrix3d ComputeClosestRotationMatrix(const Eigen::Matrix3d &matrix)
Eigen::Vector3d QuaternionRotatePoint(const Eigen::Vector4d &qvec, const Eigen::Vector3d &point)
double CalculateNormalizedAngularError(const Eigen::Vector2d &point2D, const Eigen::Vector3d &point3D, const Eigen::Vector4d &qvec, const Eigen::Vector3d &tvec)
Eigen::Matrix3x4d ComposeProjectionMatrix(const Eigen::Vector4d &qvec, const Eigen::Vector3d &tvec)
Eigen::Vector2d ProjectPointToImage(const Eigen::Vector3d &point3D, const Eigen::Matrix3x4d &proj_matrix, const Camera &camera)
double CalculateAngularError(const Eigen::Vector2d &point2D, const Eigen::Vector3d &point3D, const Eigen::Vector4d &qvec, const Eigen::Vector3d &tvec, const Camera &camera)
Eigen::Matrix3d QuaternionToRotationMatrix(const Eigen::Vector4d &qvec)