38template <distortion_model DistortionT>
41 using Scalar =
typename DistortionT::Scalar;
62 template <
typename Derived>
74 auto apply_intrinsics(
const Eigen::Matrix<T, 2, 1>& pixel)
const -> Eigen::Matrix<T, 2, 1> {
75 return normalize<T>(
kmtx, pixel);
80 auto remove_intrinsics(
const Eigen::Matrix<T, 2, 1>& norm_xy)
const -> Eigen::Matrix<T, 2, 1> {
81 return denormalize<T>(
kmtx, norm_xy);
86 auto distort(
const Eigen::Matrix<T, 2, 1>& norm_xy)
const -> Eigen::Matrix<T, 2, 1> {
87 return distortion.template distort<T>(norm_xy);
92 auto undistort(
const Eigen::Matrix<T, 2, 1>& distorted_xy)
const -> Eigen::Matrix<T, 2, 1> {
93 return distortion.template undistort<T>(distorted_xy);
98 auto project(
const Eigen::Matrix<T, 2, 1>& norm_xy)
const -> Eigen::Matrix<T, 2, 1> {
102 template <
typename T>
104 auto project(
const Eigen::Matrix<T, 3, 1>& xyz)
const -> Eigen::Matrix<T, 2, 1> {
105 Eigen::Matrix<T, 2, 1> norm_xy = xyz.hnormalized();
109 template <
typename T>
111 auto unproject(
const Eigen::Matrix<T, 2, 1>& pixel)
const -> Eigen::Matrix<T, 2, 1> {
117template <distortion_model DistortionT>
119 static constexpr size_t param_count = 10;
120 static constexpr int idx_fx = 0;
121 static constexpr int idx_fy = 1;
122 static constexpr int idx_skew = 4;
124 static constexpr int k_num_dist_coeffs = 5;
125 template <
typename T>
128 Eigen::Matrix<T, Eigen::Dynamic, 1> dist(k_num_dist_coeffs);
129 constexpr int k_intr_offset = 5;
130 dist << intr[k_intr_offset], intr[k_intr_offset + 1], intr[k_intr_offset + 2],
131 intr[k_intr_offset + 3], intr[k_intr_offset + 4];
136 std::array<double, param_count>& arr) {
137 arr[0] =
cam.kmtx.fx;
138 arr[1] =
cam.kmtx.fy;
139 arr[2] =
cam.kmtx.cx;
140 arr[3] =
cam.kmtx.cy;
141 arr[4] =
cam.kmtx.skew;
142 constexpr int k_intr_offset = 5;
143 for (
int i = 0; i < k_num_dist_coeffs; ++i) {
144 arr[k_intr_offset + i] =
cam.distortion.coeffs[i];
148 template <
typename T>
150 const Eigen::Matrix<T, 2, 1>& mx_my) {
152 return denormalize<T>(kmtx, mx_my);
155 template <
typename T>
157 const Eigen::Matrix<T, 2, 1>& px_py) {
159 return normalize<T>(kmtx, px_py);
164template <distortion_model DistortionT>
167template <distortion_model DistortionT>
169 j = {{
"kmtx",
cam.kmtx}, {
"distortion",
cam.distortion}};
172template <distortion_model DistortionT>
174 j.at(
"kmtx").get_to(
cam.kmtx);
175 if (j.contains(
"distortion")) j.at(
"distortion").get_to(
cam.distortion);
178static_assert(camera_model<PinholeCamera<BrownConrady<double>>>);
Pinhole camera model with intrinsics and distortion correction.
PinholeCamera(const CameraMatrixT< Scalar > &matrix, const DistortionT &distortion_model)
Construct camera with intrinsic matrix and distortion model.
CameraMatrixT< Scalar > kmtx
Intrinsic camera matrix parameters.
DistortionT distortion
Distortion model instance.
PinholeCamera(const CameraMatrixT< Scalar > &matrix, const Eigen::MatrixBase< Derived > &coeffs)
Construct camera with intrinsic matrix and distortion coefficients.
auto project(const Eigen::Matrix< T, 3, 1 > &xyz) const -> Eigen::Matrix< T, 2, 1 >
auto remove_intrinsics(const Eigen::Matrix< T, 2, 1 > &norm_xy) const -> Eigen::Matrix< T, 2, 1 >
auto undistort(const Eigen::Matrix< T, 2, 1 > &distorted_xy) const -> Eigen::Matrix< T, 2, 1 >
auto project(const Eigen::Matrix< T, 2, 1 > &norm_xy) const -> Eigen::Matrix< T, 2, 1 >
auto apply_intrinsics(const Eigen::Matrix< T, 2, 1 > &pixel) const -> Eigen::Matrix< T, 2, 1 >
Normalize pixel coordinates using intrinsic parameters.
typename DistortionT::Scalar Scalar
Scalar type from distortion model.
auto unproject(const Eigen::Matrix< T, 2, 1 > &pixel) const -> Eigen::Matrix< T, 2, 1 >
auto distort(const Eigen::Matrix< T, 2, 1 > &norm_xy) const -> Eigen::Matrix< T, 2, 1 >
PinholeCamera()=default
Default constructor.
Concept defining the interface for lens distortion models.
Lens distortion models and correction algorithms.
std::vector< Eigen::Isometry3d > cam
Linear multi-camera extrinsics initialisation (DLT)
void from_json(const nlohmann::json &j, T &value)
void to_json(nlohmann::json &j, const T &value)
auto matrix(const CameraMatrixT< Scalar > &cam) -> Eigen::Matrix< Scalar, 3, 3 >
static Eigen::Matrix< T, 2, 1 > remove_linear_intrinsics(const PinholeCamera< DistortionT > &cam, const Eigen::Matrix< T, 2, 1 > &px_py)
static auto from_array(const T *intr) -> PinholeCamera< BrownConrady< T > >
static void to_array(const PinholeCamera< DistortionT > &cam, std::array< double, param_count > &arr)
static Eigen::Matrix< T, 2, 1 > apply_linear_intrinsics(const PinholeCamera< DistortionT > &cam, const Eigen::Matrix< T, 2, 1 > &mx_my)
Type traits template for camera model implementations.