in IsometricPatternMatcher/CameraModels.h [107:163]
static Eigen::Matrix<typename D::Scalar, 2, 1> project(
const Eigen::MatrixBase<D>& pointOptical,
const Eigen::MatrixBase<DP>& params,
Eigen::MatrixBase<DJ1>* d_point = nullptr,
Eigen::MatrixBase<DJ2>* d_params = nullptr) {
using T = typename D::Scalar;
static_assert(D::RowsAtCompileTime == 3 && D::ColsAtCompileTime == 1,
"THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE");
static_assert(
DP::ColsAtCompileTime == 1 && (DP::RowsAtCompileTime == kNumParams ||
DP::RowsAtCompileTime == Eigen::Dynamic),
"THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE");
static_assert((DJ1::ColsAtCompileTime == 3 ||
DJ1::ColsAtCompileTime == Eigen::Dynamic) &&
(DJ1::RowsAtCompileTime == 2 ||
DJ1::RowsAtCompileTime == Eigen::Dynamic),
"THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE");
static_assert((DJ2::ColsAtCompileTime == kNumParams ||
DJ2::ColsAtCompileTime == Eigen::Dynamic) &&
(DJ2::RowsAtCompileTime == 2 ||
DJ2::RowsAtCompileTime == Eigen::Dynamic),
"THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE");
SOPHUS_ENSURE(pointOptical.z() != T(0), "z(%) must not be zero.",
pointOptical.z());
// Focal length and principal point
const Eigen::Matrix<T, 2, 1> ff = params.template head<2>();
const Eigen::Matrix<T, 2, 1> pp = params.template segment<2>(2);
const Eigen::Matrix<T, 2, 1> px =
(Project(pointOptical).array() * ff.array()).matrix() + pp;
if (d_point) {
const T oneOverZ = T(1) / pointOptical(2);
(*d_point)(0, 0) = ff(0) * oneOverZ;
(*d_point)(0, 1) = 0.0;
(*d_point)(0, 2) = -(*d_point)(0, 0) * pointOptical(0) * oneOverZ;
(*d_point)(1, 0) = 0.0;
(*d_point)(1, 1) = ff(1) * oneOverZ;
(*d_point)(1, 2) = -(*d_point)(1, 1) * pointOptical(1) * oneOverZ;
}
if (d_params) {
(*d_params)(0, 0) = pointOptical(0) / pointOptical(2);
(*d_params)(0, 1) = T(0.0);
(*d_params)(0, 2) = T(1.0);
(*d_params)(0, 3) = T(0.0);
(*d_params)(1, 0) = T(0.0);
(*d_params)(1, 1) = pointOptical(1) / pointOptical(2);
(*d_params)(1, 2) = T(0.0);
(*d_params)(1, 3) = T(1.0);
}
return px;
}