Go to the documentation of this file.
24 #include <Eigen/Dense>
35 template <
class TScalar>
37 -> Eigen::Matrix<TScalar, 2, 1> {
38 return TScalar(0.5) * in;
45 template <
class TScalar>
47 -> Eigen::Matrix<TScalar, 2, 1> {
48 return TScalar(2.0) * in;
55 template <
class TScalar>
56 auto binDown(Eigen::Matrix<TScalar, 2, 1>
const& in)
57 -> Eigen::Matrix<TScalar, 2, 1> {
58 Eigen::Matrix<TScalar, 2, 1> out;
61 out[0] = TScalar(0.5) * (in[0] + 0.5) - 0.5;
62 out[1] = TScalar(0.5) * (in[1] + 0.5) - 0.5;
70 template <
class TScalar>
71 auto binUp(Eigen::Matrix<TScalar, 2, 1>
const& in)
72 -> Eigen::Matrix<TScalar, 2, 1> {
73 Eigen::Matrix<TScalar, 2, 1> out;
76 out[0] = TScalar(2.0) * (in[0] + 0.5) - 0.5;
77 out[1] = TScalar(2.0) * (in[1] + 0.5) - 0.5;
82 template <
class TScalar,
class TDistortion,
class TProj = ProjectionZ1>
88 static int constexpr
kNumParams = Distortion::kNumParams;
90 Distortion::kProjectionModel;
95 using Params = Eigen::Matrix<TScalar, kNumParams, 1>;
100 : image_size_(image_size), params_(
params) {}
104 params_.template head<2>().setOnes();
111 Eigen::Map<Eigen::Matrix<TScalar, kNumParams, 1>
const> map(
119 return params_.template head<2>();
124 params_.template head<2>() = focal_length;
128 return params_.template segment<2>(2);
133 params_.template segment<2>(2) = principal_point;
138 return params_.template tail<kNumDistortionParams>();
142 auto params() -> Eigen::Matrix<TScalar, kNumParams, 1>& {
return params_; }
162 params.template segment<2>(2).eval());
174 params.template segment<2>(2) =
191 params.template segment<2>(2) =
204 params.template segment<2>(2) =
212 params[0] = TScalar(image_size.width) / TScalar(image_size_.
width) *
214 params[1] = TScalar(image_size.height) / TScalar(image_size_.
height) *
216 params[2] = TScalar(image_size.width) / TScalar(image_size_.
width) *
218 params[3] = TScalar(image_size.height) / TScalar(image_size_.
height) *
224 [[nodiscard]]
auto roi(Eigen::Vector2i
const& top_left,
ImageSize roi_size)
235 return Distortion::template
distort(params_, point2_in_camera_lifted);
239 -> Eigen::Matrix<TScalar, 2, 2> {
240 return Distortion::template
dxDistort(params_, pixel_in_image);
246 return Distortion::template
undistort(params_, pixel_in_image);
251 for (
int v = 0; v < table.height(); ++v) {
252 Eigen::Vector2f* row_ptr = table.rowPtrMut(v);
253 for (
int u = 0; u < table.width(); ++u) {
267 -> Eigen::Matrix<TScalar, 2, 3> {
278 Distortion::template
undistort(params_, pixel_in_image), depth_z);
282 auto data() -> TScalar* {
return params_.data(); }
292 [[nodiscard]]
auto contains(Eigen::Vector2i
const& obs,
int border = 0) const
294 return this->image_size_.
contains(obs, border);
301 PixelImage const& obs, TScalar border = TScalar(0)) const ->
bool {
302 return this->image_size_.
contains(obs, border);
306 template <
typename TScalar2>
307 [[nodiscard]]
auto cast() const
310 image_size_, params_.template cast<TScalar2>());
315 Eigen::Matrix<TScalar, kNumParams, 1> params_;
320 CameraDistortionType,
321 (pinhole, brown_conrady, kannala_brandt_k3, orthographic));
345 std::variant_size_v<CameraDistortionVariant> ==
346 getCount(CameraDistortionType()),
347 "When the variant CameraDistortionVariant is updated, one needs to "
348 "update the enum CameraDistortionType as well, and vice versa.");
354 : model_(
PinholeModel({0, 0}, Eigen::Vector4d(1.0, 1.0, 0.0, 0.0))) {}
357 template <
class TTransformModelT>
367 CameraDistortionType projection_type,
368 Eigen::VectorXd
const&
params);
391 [[nodiscard]]
auto distortionType() const -> CameraDistortionType;
404 [[nodiscard]] auto
params() const ->
Eigen::VectorXd;
417 [[nodiscard]] auto
camProj(
Eigen::Vector3d const& point_camera) const
423 Eigen::Vector2d const& point2_in_camera_lifted) const ->
Eigen::Vector2d;
426 Eigen::Vector2d const& point2_in_camera_lifted) const ->
Eigen::Matrix2d;
429 [[nodiscard]] auto
undistort(
Eigen::Vector2d const& pixel_image) const
435 [[nodiscard]] auto
dxCamProjX(
Eigen::Vector3d const& point_in_camera) const
436 ->
Eigen::Matrix<
double, 2, 3>;
440 Eigen::Vector3d const& point_in_camera) const
441 ->
Eigen::Matrix<
double, 2, 6>;
446 Eigen::Vector2d const& pixel_image,
double depth_z) const
480 [[nodiscard]] auto
roi(
486 [[nodiscard]] auto
contains(
Eigen::Vector2i const& obs,
int border = 0) const
493 Eigen::Vector2d const& obs,
double border = 0) const ->
bool;
auto binDown(Eigen::Matrix< TScalar, 2, 1 > const &in) -> Eigen::Matrix< TScalar, 2, 1 >
Bins pixel down, factor of 0.5.
Definition: camera_model.h:56
auto subsampleDown() const -> CameraModelT
Subsamples pixel down, factor of 0.5.
Definition: camera_model.h:157
auto unproj(Eigen::MatrixBase< TPoint > const &p, const typename TPoint::Scalar &z=1.0) -> Eigen::Vector< typename TPoint::Scalar, TPoint::RowsAtCompileTime+1 >
Maps point on the z=1 plane (a,b) to homogeneous representation of the same point: (z*a,...
Definition: homogeneous.h:31
auto dxCamProjX(PointCamera const &point_in_camera) const -> Eigen::Matrix< TScalar, 2, 3 >
Definition: camera_model.h:266
auto focalLength() const -> Eigen::Vector2d
Definition: camera_model.cpp:60
CameraModelT()
Definition: camera_model.h:102
static constexpr const std::string_view kProjectionModel
Definition: camera_model.h:89
CameraModelT(ImageSize const &image_size, Params const ¶ms)
Constructs camera model from image size and set up parameters.
Definition: camera_model.h:99
auto contains(Eigen::Vector2i const &obs, int border=0) const -> bool
Returns true if obs is within image.
Definition: camera_model.h:292
void setFocalLength(PixelImage const &focal_length)
Focal length.
Definition: camera_model.h:123
auto undistortTable() const -> MutImage< Eigen::Vector2f >
Definition: camera_model.h:249
auto binUp(Eigen::Matrix< TScalar, 2, 1 > const &in) -> Eigen::Matrix< TScalar, 2, 1 >
Bins pixel up, factor of 2.0.
Definition: camera_model.h:71
static constexpr int kNumDistortionParams
Definition: camera_model.h:87
Camera model class template for pinhole-like camera projections.
Definition: camera_model.h:83
auto half(ImageSize image_size) -> ImageSize
If the original width [height] is odd, the new width [height] will be: (width+1)/2 [height+1)/2].
Definition: image_size.cpp:29
auto undistort(Eigen::Vector2d const &pixel_image) const -> Eigen::Vector2d
Maps a pixel in the image to a 2-point in the z=1 plane of the camera.
Definition: camera_model.cpp:129
Image MutImage, owning images types.
Definition: num_diff.h:20
auto distortionModelName() const -> std::string_view
Returns name of the camera distortion model.
Definition: camera_model.cpp:46
CameraModelT< double, BrownConradyTransform, ProjectionZ1 > BrownConradyModel
Brown Conrady camera model.
Definition: camera_model.h:328
CameraModelT< double, KannalaBrandtK3Transform, ProjectionZ1 > KannalaBrandtK3Model
KannalaBrandt camera model with k0, k1, k2, k3.
Definition: camera_model.h:332
CameraModel(TTransformModelT model)
Constructs camera model from frame_name and concrete projection model.
Definition: camera_model.h:358
auto subsampleUp() const -> CameraModelT
Subsamples pixel up, factor of 2.0.
Definition: camera_model.h:170
auto undistortTable() const -> MutImage< Eigen::Vector2f >
Definition: camera_model.cpp:136
Concrete camera model class.
Definition: camera_model.h:351
void setPrincipalPoint(Eigen::Vector2d const &principal_point)
Focal length.
Definition: camera_model.cpp:77
auto scale(ImageSize const &image_size) const -> CameraModelT
Definition: camera_model.h:210
auto cast() const -> CameraModelT< TScalar2, TDistortion, TProj >
cast to different scalar type.
Definition: camera_model.h:307
auto dxCamProjExpXPointAt0(Eigen::Vector3d const &point_in_camera) const -> Eigen::Matrix< double, 2, 6 >
Derivative of camProj(exp(x) * point) with respect to x=0.
Definition: camera_model.cpp:154
auto subsampleDown(Eigen::Matrix< TScalar, 2, 1 > const &in) -> Eigen::Matrix< TScalar, 2, 1 >
Subsamples pixel down, factor of 0.5.
Definition: camera_model.h:36
static auto fromData(TScalar const *const ptr) -> CameraModelT
Returns camera model from raw data pointer. To be used within ceres optimization only.
Definition: camera_model.h:109
auto dxProjX(InverseDepthPoint3< TT > const &) -> Eigen::Matrix< TT, 2, 3 >
Returns point derivative of inverse depth point projection:
Definition: point_transform.h:29
auto roi(Eigen::Vector2i const &top_left, ImageSize roi_size) const -> CameraModel
Region of interest given top_left and `roi_size.
Definition: camera_model.cpp:189
auto dxDistort(Eigen::Vector2d const &point2_in_camera_lifted) const -> Eigen::Matrix2d
Definition: camera_model.cpp:120
auto subsampleDown() const -> CameraModel
Subsamples pixel down, factor of 0.5.
Definition: camera_model.cpp:165
auto modelVariant() -> CameraDistortionVariant &
Distortion variant mutator.
Definition: camera_model.h:383
Eigen::Matrix< double, 2, 1 > PixelImage
Definition: camera_model.h:93
auto undistort(PixelImage const &pixel_in_image) const -> ProjInCameraLifted
Maps a pixel in the image to a 2-point in the z=1 plane of the camera.
Definition: camera_model.h:244
void setFocalLength(Eigen::Vector2d const &focal_length)
Focal length.
Definition: camera_model.cpp:65
auto binUp() const -> CameraModelT
Bins pixel up, factor of 2.0.
Definition: camera_model.h:200
Eigen::Matrix< double, kNumParams, 1 > Params
Definition: camera_model.h:95
auto params() -> Eigen::Matrix< TScalar, kNumParams, 1 > &
Parameters mutator.
Definition: camera_model.h:142
auto contains(Eigen::Vector2i const &obs, int border=0) const -> bool
Returns true if obs is within image.
Definition: camera_model.cpp:200
Eigen::Matrix< double, 3, 1 > PointCamera
Definition: camera_model.h:92
auto dxDistort(PixelImage const &pixel_in_image) const -> Eigen::Matrix< TScalar, 2, 2 >
Definition: camera_model.h:238
auto isEmpty() const -> bool
Returns true if this camera remains default-initialized with zero image dimensions.
Definition: camera_model.h:375
A image with write access to pixels and exclusive ownership. There is no copy constr / copy assignmen...
Definition: image_view.h:32
auto camUnproj(PixelImage const &pixel_in_image, double depth_z) const -> PointCamera
Unprojects pixel in the image to point in camera frame.
Definition: camera_model.h:275
auto distortionParams() const -> Eigen::VectorXd
Returns distortion parameters vector by value.
Definition: camera_model.cpp:85
auto params() const -> Eigen::Matrix< TScalar, kNumParams, 1 > const &
Parameters accessor.
Definition: camera_model.h:145
auto camProj(PointCamera const &point_in_camera) const -> PixelImage
Projects 3-point in camera frame to a pixel in the image.
Definition: camera_model.h:261
auto focalLength() const -> PixelImage
Focal length.
Definition: camera_model.h:118
SOPHUS_ENUM(NumberType,(fixed_point, floating_point))
CameraModelT< double, AffineTransform, ProjectionZ1 > PinholeModel
Pinhole camera model.
Definition: camera_model.h:324
auto imageSize() const -> ImageSize const &
Image size accessor.
Definition: camera_model.cpp:207
auto data() -> TScalar *
Raw data access. To be used in ceres optimization only.
Definition: camera_model.h:282
auto binDown() const -> CameraModel
Bins pixel down, factor of 0.5.
Definition: camera_model.cpp:177
auto distort(ProjInCameraLifted const &point2_in_camera_lifted) const -> PixelImage
Maps a 2-point in the z=1 plane of the camera to a pixel in the image.
Definition: camera_model.h:233
auto contains(PixelImage const &obs, TScalar border=TScalar(0)) const -> bool
Returns true if obs is within image.
Definition: camera_model.h:300
Eigen::Matrix< double, 2, 1 > ProjInCameraLifted
Definition: camera_model.h:94
auto params() const -> Eigen::VectorXd
Returns params vector by value.
Definition: camera_model.cpp:55
auto imageSize() const -> ImageSize const &
Accessor of image size.
Definition: camera_model.h:285
auto scale(ImageSize image_size) const -> CameraModel
Definition: camera_model.cpp:244
auto distortionType() const -> CameraDistortionType
Camera transform flag.
Definition: camera_model.cpp:220
auto distort(Eigen::Vector2d const &point2_in_camera_lifted) const -> Eigen::Vector2d
Maps a 2-point in the z=1 plane of the camera to a (distorted) pixel in the image.
Definition: camera_model.cpp:111
auto subsampleUp(Eigen::Matrix< TScalar, 2, 1 > const &in) -> Eigen::Matrix< TScalar, 2, 1 >
Subsamples pixel up, factor of 2.0.
Definition: camera_model.h:46
std::variant< PinholeModel, BrownConradyModel, KannalaBrandtK3Model, OrthographicModel > CameraDistortionVariant
Variant of camera models.
Definition: camera_model.h:342
static auto createDefaultPinholeModel(ImageSize image_size) -> CameraModel
Creates default pinhole model from image_size.
Definition: camera_model.cpp:239
auto dxCamProjX(Eigen::Vector3d const &point_in_camera) const -> Eigen::Matrix< double, 2, 3 >
Derivative of camProj(x) with respect to x=0.
Definition: camera_model.cpp:145
auto camUnproj(Eigen::Vector2d const &pixel_image, double depth_z) const -> Eigen::Vector3d
Given pixel coordinates in the distorted image, and a corresponding depth, reproject to a 3d point in...
Definition: camera_model.cpp:102
auto binUp() const -> CameraModel
Bins pixel up, factor of 2.0.
Definition: camera_model.cpp:183
int height
Vertical height of images, i.e. number of rows.
Definition: image_size.h:56
int width
Horizontal width of images, i.e. number of columns.
Definition: image_size.h:53
void setParams(Eigen::VectorXd const ¶ms)
Sets params vector.
Definition: camera_model.cpp:91
auto modelVariant() const -> CameraDistortionVariant const &
Distortion variant accessor.
Definition: camera_model.h:386
auto proj(InverseDepthPoint3< TT > const &inverse_depth_point) -> Eigen::Matrix< TT, 2, 1 >
Projects 3-point (a,b,psi) = (x/z,y/z,1/z) through the origin (0,0,0) onto the plane z=1....
Definition: point_transform.h:20
auto principalPoint() const -> PixelImage
Definition: camera_model.h:127
auto createDefaultOrthoModel(ImageSize image_size) -> OrthographicModel
Creates default orthographic model from image_size.
Definition: camera_model.cpp:261
CameraModel()
Definition: camera_model.h:353
auto roi(Eigen::Vector2i const &top_left, ImageSize roi_size) const -> CameraModelT
Region of interest given top_left and `roi_size.
Definition: camera_model.h:224
auto distortionParams() const -> DistorationParams
Returns distortion parameters by value.
Definition: camera_model.h:137
Eigen::Matrix< double, kNumDistortionParams, 1 > DistorationParams
Definition: camera_model.h:96
Image size, hence its width and height.
Definition: image_size.h:21
auto contains(Eigen::Vector2i const &obs, int border=0) const -> bool
Returns true if obs is within image.
Definition: image_size.cpp:13
auto binDown() const -> CameraModelT
Bins pixel down, factor of 0.5.
Definition: camera_model.h:187
auto subsampleUp() const -> CameraModel
Subsamples pixel up, factor of 2.0.
Definition: camera_model.cpp:171
void setPrincipalPoint(PixelImage const &principal_point)
Focal length.
Definition: camera_model.h:132
auto camProj(Eigen::Vector3d const &point_camera) const -> Eigen::Vector2d
Given a point in 3D space in the camera frame, compute the corresponding pixel coordinates in the ima...
Definition: camera_model.cpp:95
Definition: projection_z1.h:15
auto principalPoint() const -> Eigen::Vector2d
Definition: camera_model.cpp:71
static constexpr int kNumParams
Definition: camera_model.h:88