16 template <
class TPo
ints,
int kRows>
18 Matrix<typename TPoints::Scalar, kRows, TPoints::ColsAtCompileTime>;
25 template <
class TDerived>
26 static auto proj(Eigen::MatrixBase<TDerived>
const& points_in_camera)
28 static_assert(TDerived::RowsAtCompileTime == 3);
29 return points_in_camera.template topRows<2>() *
30 points_in_camera.template bottomRows<1>().asDiagonal().inverse();
33 template <
class TDerived>
35 Eigen::MatrixBase<TDerived>
const& points_in_cam_canonical,
36 typename TDerived::Scalar extension =
37 static_cast<typename TDerived::Scalar
>(1.0))
39 static_assert(TDerived::RowsAtCompileTime == 2);
41 unprojected.template topRows<2>() = points_in_cam_canonical * extension;
42 unprojected.template bottomRows<1>() =
44 points_in_cam_canonical.cols(), extension);
51 template <
class TScalar>
52 static auto dxProjX(Eigen::Matrix<TScalar, 3, 1>
const& p)
53 -> Eigen::Matrix<TScalar, 2, 3> {
54 Eigen::Matrix<TScalar, 2, 3> dx;
56 TScalar z_inv = 1 / p.z();
57 TScalar z_sq = p.z() * p.z();
60 z_inv, 0, -p.x()/z_sq,
61 0, z_inv, -p.y()/z_sq;