18 #ifndef OPTIMIZATION_COMMON_UTILITIES_H_
19 #define OPTIMIZATION_COMMON_UTILITIES_H_
23 #include <ceres/ceres.h>
24 #include <ceres/rotation.h>
32 Eigen::Matrix<T, 6, 1>
VectorFromIsometry3(
const Eigen::Transform<T, 3, Eigen::Isometry>& isometry_3);
41 Eigen::Transform<T, 3, Eigen::Isometry>
Isometry3(
const T* isometry_data);
42 Eigen::Matrix3d
Intrinsics(
const Eigen::Vector2d& focal_lengths,
const Eigen::Vector2d& principal_points);
46 Eigen::Transform<T, 3, Eigen::Affine>
Affine3(
const T* affine_data);
54 Eigen::Matrix<T, 3, 3>
Intrinsics(
const T* intrinsics_data);
57 Eigen::Matrix<T, 3, 3>
Intrinsics(
const T* focal_lengths,
const T* principal_points);
59 void AddParameterBlock(
const int num_parameters,
double*
const parameters, ceres::Problem& problem,
60 const bool set_constant =
false);
66 double ResidualNorm(
const std::vector<double>& residual,
const int index,
const int residual_size);
69 void CheckResiduals(
const int residual_size, ceres::Problem& problem,
const double outlier_threshold = 0.99);
72 Eigen::Matrix<T, 6, 1>
VectorFromIsometry3(
const Eigen::Transform<T, 3, Eigen::Isometry>& isometry_3) {
74 const Eigen::Matrix<T, 3, 3> rotation = isometry_3.linear();
75 Eigen::Matrix<T, 6, 1> isometry_3_vector;
76 ceres::RotationMatrixToAngleAxis(rotation.data(), &(isometry_3_vector.data()[0]));
77 isometry_3_vector[3] = isometry_3.translation().x();
78 isometry_3_vector[4] = isometry_3.translation().y();
79 isometry_3_vector[5] = isometry_3.translation().z();
80 return isometry_3_vector;
84 Eigen::Transform<T, 3, Eigen::Isometry>
Isometry3(
const T* isometry_data) {
85 Eigen::Matrix<T, 3, 3> rotation;
86 ceres::AngleAxisToRotationMatrix(isometry_data, rotation.data());
87 Eigen::Map<const Eigen::Matrix<T, 3, 1>> translation(&isometry_data[3]);
88 Eigen::Transform<T, 3, Eigen::Isometry> isometry_3(Eigen::Transform<T, 3, Eigen::Isometry>::Identity());
89 isometry_3.linear() = rotation;
90 isometry_3.translation() = translation;
95 Eigen::Transform<T, 3, Eigen::Affine>
Affine3(
const T* affine_data) {
96 const Eigen::Transform<T, 3, Eigen::Isometry> isometry_3 =
Isometry3(affine_data);
97 const T scale = affine_data[6];
98 Eigen::Transform<T, 3, Eigen::Affine> affine_3;
99 affine_3.linear() = scale * isometry_3.linear();
100 affine_3.translation() = isometry_3.translation();
104 template <
typename T>
105 Eigen::Matrix<T, 3, 3>
Intrinsics(
const T* intrinsics_data) {
106 Eigen::Matrix<T, 3, 3> intrinsics(Eigen::Matrix<T, 3, 3>::Identity());
107 intrinsics(0, 0) = intrinsics_data[0];
108 intrinsics(1, 1) = intrinsics_data[1];
109 intrinsics(0, 2) = intrinsics_data[2];
110 intrinsics(1, 2) = intrinsics_data[3];
114 template <
typename T>
115 Eigen::Matrix<T, 3, 3>
Intrinsics(
const T* focal_lengths,
const T* principal_points) {
116 Eigen::Matrix<T, 3, 3> intrinsics(Eigen::Matrix<T, 3, 3>::Identity());
117 intrinsics(0, 0) = focal_lengths[0];
118 intrinsics(1, 1) = focal_lengths[1];
119 intrinsics(0, 2) = principal_points[0];
120 intrinsics(1, 2) = principal_points[1];
125 #endif // OPTIMIZATION_COMMON_UTILITIES_H_