Calibration Library 1.0.0
A C++ library for camera calibration and vision-related geometric transformations
Loading...
Searching...
No Matches
pinhole.h
Go to the documentation of this file.
1
11#pragma once
12
13#include <Eigen/Core>
14#include <array>
15
19
20namespace calib {
21
38template <distortion_model DistortionT>
39class PinholeCamera final {
40 public:
41 using Scalar = typename DistortionT::Scalar;
43 DistortionT distortion;
44
46 PinholeCamera() = default;
47
55
62 template <typename Derived>
63 PinholeCamera(const CameraMatrixT<Scalar>& matrix, const Eigen::MatrixBase<Derived>& coeffs)
64 : kmtx(matrix), distortion(coeffs) {}
65
72 template <typename T>
73 [[nodiscard]]
74 auto apply_intrinsics(const Eigen::Matrix<T, 2, 1>& pixel) const -> Eigen::Matrix<T, 2, 1> {
75 return normalize<T>(kmtx, pixel);
76 }
77
78 template <typename T>
79 [[nodiscard]]
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);
82 }
83
84 template <typename T>
85 [[nodiscard]]
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);
88 }
89
90 template <typename T>
91 [[nodiscard]]
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);
94 }
95
96 template <typename T>
97 [[nodiscard]]
98 auto project(const Eigen::Matrix<T, 2, 1>& norm_xy) const -> Eigen::Matrix<T, 2, 1> {
99 return remove_intrinsics(distort(norm_xy));
100 }
101
102 template <typename T>
103 [[nodiscard]]
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();
106 return remove_intrinsics(distort(norm_xy));
107 }
108
109 template <typename T>
110 [[nodiscard]]
111 auto unproject(const Eigen::Matrix<T, 2, 1>& pixel) const -> Eigen::Matrix<T, 2, 1> {
112 return undistort(apply_intrinsics(pixel));
113 }
114};
115
116// Pinhole camera traits specialisation
117template <distortion_model DistortionT>
118struct CameraTraits<PinholeCamera<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;
123
124 static constexpr int k_num_dist_coeffs = 5;
125 template <typename T>
126 static auto from_array(const T* intr) -> PinholeCamera<BrownConrady<T>> {
127 CameraMatrixT<T> k_matrix{intr[0], intr[1], intr[2], intr[3], intr[4]};
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];
132 return PinholeCamera<BrownConrady<T>>(k_matrix, dist);
133 }
134
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];
145 }
146 }
147
148 template <typename T>
149 static Eigen::Matrix<T, 2, 1> apply_linear_intrinsics(const PinholeCamera<DistortionT>& cam,
150 const Eigen::Matrix<T, 2, 1>& mx_my) {
151 CameraMatrixT<T> kmtx{T(cam.kmtx.fx), T(cam.kmtx.fy), T(0), T(0), T(cam.kmtx.skew)};
152 return denormalize<T>(kmtx, mx_my);
153 }
154
155 template <typename T>
156 static Eigen::Matrix<T, 2, 1> remove_linear_intrinsics(const PinholeCamera<DistortionT>& cam,
157 const Eigen::Matrix<T, 2, 1>& px_py) {
158 CameraMatrixT<T> kmtx{T(cam.kmtx.fx), T(cam.kmtx.fy), T(0), T(0), T(cam.kmtx.skew)};
159 return normalize<T>(kmtx, px_py);
160 }
161};
162
163// Backwards compatibility alias
164template <distortion_model DistortionT>
166
167template <distortion_model DistortionT>
168inline void to_json(nlohmann::json& j, const PinholeCamera<DistortionT>& cam) {
169 j = {{"kmtx", cam.kmtx}, {"distortion", cam.distortion}};
170}
171
172template <distortion_model DistortionT>
173inline void from_json(const nlohmann::json& j, PinholeCamera<DistortionT>& cam) {
174 j.at("kmtx").get_to(cam.kmtx);
175 if (j.contains("distortion")) j.at("distortion").get_to(cam.distortion);
176}
177
178static_assert(camera_model<PinholeCamera<BrownConrady<double>>>);
179
180} // namespace calib
Pinhole camera model with intrinsics and distortion correction.
Definition pinhole.h:39
PinholeCamera(const CameraMatrixT< Scalar > &matrix, const DistortionT &distortion_model)
Construct camera with intrinsic matrix and distortion model.
Definition pinhole.h:53
CameraMatrixT< Scalar > kmtx
Intrinsic camera matrix parameters.
Definition pinhole.h:42
DistortionT distortion
Distortion model instance.
Definition pinhole.h:43
PinholeCamera(const CameraMatrixT< Scalar > &matrix, const Eigen::MatrixBase< Derived > &coeffs)
Construct camera with intrinsic matrix and distortion coefficients.
Definition pinhole.h:63
auto project(const Eigen::Matrix< T, 3, 1 > &xyz) const -> Eigen::Matrix< T, 2, 1 >
Definition pinhole.h:104
auto remove_intrinsics(const Eigen::Matrix< T, 2, 1 > &norm_xy) const -> Eigen::Matrix< T, 2, 1 >
Definition pinhole.h:80
auto undistort(const Eigen::Matrix< T, 2, 1 > &distorted_xy) const -> Eigen::Matrix< T, 2, 1 >
Definition pinhole.h:92
auto project(const Eigen::Matrix< T, 2, 1 > &norm_xy) const -> Eigen::Matrix< T, 2, 1 >
Definition pinhole.h:98
auto apply_intrinsics(const Eigen::Matrix< T, 2, 1 > &pixel) const -> Eigen::Matrix< T, 2, 1 >
Normalize pixel coordinates using intrinsic parameters.
Definition pinhole.h:74
typename DistortionT::Scalar Scalar
Scalar type from distortion model.
Definition pinhole.h:41
auto unproject(const Eigen::Matrix< T, 2, 1 > &pixel) const -> Eigen::Matrix< T, 2, 1 >
Definition pinhole.h:111
auto distort(const Eigen::Matrix< T, 2, 1 > &norm_xy) const -> Eigen::Matrix< T, 2, 1 >
Definition pinhole.h:86
PinholeCamera()=default
Default constructor.
Concept defining the interface for lens distortion models.
Definition distortion.h:48
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)
Definition json.h:89
void to_json(nlohmann::json &j, const T &value)
Definition json.h:49
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)
Definition pinhole.h:156
static auto from_array(const T *intr) -> PinholeCamera< BrownConrady< T > >
Definition pinhole.h:126
static void to_array(const PinholeCamera< DistortionT > &cam, std::array< double, param_count > &arr)
Definition pinhole.h:135
static Eigen::Matrix< T, 2, 1 > apply_linear_intrinsics(const PinholeCamera< DistortionT > &cam, const Eigen::Matrix< T, 2, 1 > &mx_my)
Definition pinhole.h:149
Type traits template for camera model implementations.
Definition cameramodel.h:64