AliceVision
Photogrammetric Computer Vision Framework
Equidistant.hpp
1 // This file is part of the AliceVision project.
2 // Copyright (c) 2020 AliceVision contributors.
3 // This Source Code Form is subject to the terms of the Mozilla Public License,
4 // v. 2.0. If a copy of the MPL was not distributed with this file,
5 // You can obtain one at https://mozilla.org/MPL/2.0/.
6 
7 #pragma once
8 
9 #include <aliceVision/numeric/numeric.hpp>
10 #include <aliceVision/numeric/projection.hpp>
11 #include <aliceVision/camera/cameraCommon.hpp>
12 #include <aliceVision/camera/IntrinsicScaleOffsetDisto.hpp>
13 #include <aliceVision/geometry/Pose3.hpp>
14 
15 #include "DistortionFisheye1.hpp"
16 
17 #include <memory>
18 #include <algorithm>
19 
20 namespace aliceVision {
21 namespace camera {
22 
29 {
30  public:
31  Equidistant()
32  : Equidistant(1, 1, 1.0, 0.0, 0.0)
33  {}
34 
35  Equidistant(unsigned int w,
36  unsigned int h,
37  double focalLengthPix,
38  double offsetX,
39  double offsetY,
40  std::shared_ptr<Distortion> distortion = nullptr)
41  : IntrinsicScaleOffsetDisto(w, h, focalLengthPix, focalLengthPix, offsetX, offsetY, distortion),
42  _circleRadius(std::min(w, h) * 0.5),
43  _circleCenter(w / 2.0, h / 2.0)
44  {}
45 
46  Equidistant(unsigned int w,
47  unsigned int h,
48  double focalLengthPix,
49  double offsetX,
50  double offsetY,
51  double circleRadiusPix,
52  std::shared_ptr<Distortion> distortion = nullptr)
53  : IntrinsicScaleOffsetDisto(w, h, focalLengthPix, focalLengthPix, offsetX, offsetY, distortion),
54  _circleRadius(circleRadiusPix != 0.0 ? circleRadiusPix : std::min(w, h) * 0.5),
55  _circleCenter(w / 2.0, h / 2.0)
56  {}
57 
58  ~Equidistant() override = default;
59 
60  Equidistant* clone() const override { return new Equidistant(*this); }
61 
62  static std::shared_ptr<Equidistant> cast(std::shared_ptr<IntrinsicBase> sptr);
63 
64  void assign(const IntrinsicBase& other) override { *this = dynamic_cast<const Equidistant&>(other); }
65 
66  bool isValid() const override { return _scale(0) > 0 && IntrinsicBase::isValid(); }
67 
68  EINTRINSIC getType() const override;
69 
70  Vec2 transformProject(const Eigen::Matrix4d& pose, const Vec4& pt, bool applyDistortion = true) const override;
71 
72  Vec2 transformProject(const geometry::Pose3& pose, const Vec4& pt3D, bool applyDistortion = true) const
73  {
74  return transformProject(pose.getHomogeneous(), pt3D, applyDistortion);
75  }
76 
77  Vec2 project(const Vec4& pt, bool applyDistortion = true) const override;
78 
79  Eigen::Matrix<double, 2, 3> getDerivativeTransformProjectWrtPoint3(const Eigen::Matrix4d& pose, const Vec4& pt) const override;
80 
81  Eigen::Matrix<double, 2, 2> getDerivativeTransformProjectWrtScale(const Eigen::Matrix4d& pose, const Vec4& pt) const;
82 
83  Eigen::Matrix<double, 2, 2> getDerivativeTransformProjectWrtPrincipalPoint(const Eigen::Matrix4d& pose, const Vec4& pt) const;
84 
85  Eigen::Matrix<double, 2, Eigen::Dynamic> getDerivativeTransformProjectWrtParams(const Eigen::Matrix4d& pose, const Vec4& pt3D) const override;
86 
87  Vec3 toUnitSphere(const Vec2& pt) const override;
88 
89  Eigen::Matrix<double, 3, 2> getDerivativetoUnitSphereWrtPoint(const Vec2& pt) const;
90 
91  Eigen::Matrix<double, 3, 2> getDerivativetoUnitSphereWrtScale(const Vec2& pt) const;
92 
98  Eigen::Matrix<double, 3, Eigen::Dynamic> getDerivativeBackProjectUnitWrtParams(const Vec2& pt2D) const override;
99 
100  Eigen::Matrix<double, 2, Eigen::Dynamic> getDerivativeTransformProjectWrtDistortion(const Eigen::Matrix4d& pose, const Vec4& pt) const override;
101 
102  Eigen::Matrix<double, 3, Eigen::Dynamic> getDerivativeBackProjectUnitWrtDistortion(const Vec2& pt2D) const override;
103 
104  double imagePlaneToCameraPlaneError(double value) const override;
105 
106  // Transform a point from the camera plane to the image plane
107  Vec2 cam2ima(const Vec2& p) const override;
108 
109  Eigen::Matrix2d getDerivativeCam2ImaWrtPoint() const override;
110 
111  // Transform a point from the image plane to the camera plane
112  Vec2 ima2cam(const Vec2& p) const override;
113 
114  Eigen::Matrix2d getDerivativeIma2CamWrtPoint() const override;
115 
116  Eigen::Matrix2d getDerivativeIma2CamWrtPrincipalPoint() const override;
117 
123  bool isVisibleRay(const Vec3& ray) const override;
124 
125  inline double getCircleRadius() const { return _circleRadius; }
126 
127  inline void setCircleRadius(double radius) { _circleRadius = radius; }
128 
129  inline double getCircleCenterX() const { return _circleCenter(0); }
130 
131  inline void setCircleCenterX(double x) { _circleCenter(0) = x; }
132 
133  inline double getCircleCenterY() const { return _circleCenter(1); }
134 
135  inline void setCircleCenterY(double y) { _circleCenter(1) = y; }
136 
137  inline Vec2 getCircleCenter() const { return _circleCenter; }
138 
143  double getHorizontalFov() const override;
144 
149  double getVerticalFov() const override;
150 
155  double pixelProbability() const override;
156 
157  protected:
158  double _circleRadius{0.0};
159  Vec2 _circleCenter{0.0, 0.0};
160 };
161 
162 } // namespace camera
163 } // namespace aliceVision
aliceVision::camera::Equidistant::imagePlaneToCameraPlaneError
double imagePlaneToCameraPlaneError(double value) const override
Normalize a given unit pixel error to the camera plane.
Definition: Equidistant.cpp:290
aliceVision::camera::Equidistant::getDerivativeBackProjectUnitWrtParams
Eigen::Matrix< double, 3, Eigen::Dynamic > getDerivativeBackProjectUnitWrtParams(const Vec2 &pt2D) const override
Get the derivative of the unit sphere backprojection.
Definition: Equidistant.cpp:263
aliceVision::camera::Equidistant::isVisibleRay
bool isVisibleRay(const Vec3 &ray) const override
Return true if this ray should be visible in the image.
Definition: Equidistant.cpp:302
aliceVision::camera::Equidistant::getType
EINTRINSIC getType() const override
Get embed camera type.
Definition: Equidistant.cpp:318
aliceVision::camera::Equidistant::clone
Equidistant * clone() const override
Polymorphic clone.
Definition: Equidistant.hpp:60
aliceVision::camera::IntrinsicBase::h
unsigned int h() const
Get the intrinsic image height.
Definition: IntrinsicBase.hpp:58
aliceVision::camera::IntrinsicBase::isValid
virtual bool isValid() const
Return true if the intrinsic is valid.
Definition: IntrinsicBase.hpp:379
aliceVision
Definition: checkerDetector.cpp:32
aliceVision::camera::Equidistant::getDerivativeTransformProjectWrtParams
Eigen::Matrix< double, 2, Eigen::Dynamic > getDerivativeTransformProjectWrtParams(const Eigen::Matrix4d &pose, const Vec4 &pt3D) const override
Get the derivative of a projection of a 3D point into the camera plane.
Definition: Equidistant.cpp:181
aliceVision::camera::Equidistant::assign
void assign(const IntrinsicBase &other) override
Assign object.
Definition: Equidistant.hpp:64
aliceVision::camera::Equidistant::pixelProbability
double pixelProbability() const override
how a one pixel change relates to an angular change
Definition: Equidistant.cpp:332
aliceVision::camera::IntrinsicBase::w
unsigned int w() const
Get the intrinsic image width.
Definition: IntrinsicBase.hpp:52
aliceVision::camera::Equidistant::getHorizontalFov
double getHorizontalFov() const override
Get the horizontal FOV in radians.
Definition: Equidistant.cpp:320
aliceVision::camera::Equidistant::getVerticalFov
double getVerticalFov() const override
Get the vertical FOV in radians.
Definition: Equidistant.cpp:330
aliceVision::camera::IntrinsicScaleOffsetDisto
Class with disto.
Definition: IntrinsicScaleOffsetDisto.hpp:23
aliceVision::camera::Equidistant
Equidistant is a camera model used for fisheye optics. See https://en.wikipedia.org/wiki/Fisheye_lens...
Definition: Equidistant.hpp:28
aliceVision::camera::Equidistant::isValid
bool isValid() const override
Return true if the intrinsic is valid.
Definition: Equidistant.hpp:66
aliceVision::camera::Equidistant::ima2cam
Vec2 ima2cam(const Vec2 &p) const override
Transform a point from the image plane to the camera plane.
Definition: Equidistant.cpp:296
aliceVision::camera::Equidistant::cam2ima
Vec2 cam2ima(const Vec2 &p) const override
Transform a point from the camera plane to the image plane.
Definition: Equidistant.cpp:292
aliceVision::camera::Equidistant::transformProject
Vec2 transformProject(const Eigen::Matrix4d &pose, const Vec4 &pt, bool applyDistortion=true) const override
Projection of a 3D point into the camera plane (Apply pose, disto (if any) and Intrinsics)
Definition: Equidistant.cpp:17
aliceVision::camera::IntrinsicBase
Basis class for all intrinsic parameters of a camera.
Definition: IntrinsicBase.hpp:27
aliceVision::camera::Equidistant::toUnitSphere
Vec3 toUnitSphere(const Vec2 &pt) const override
Transform a given point (in pixels) to unit sphere in meters.
Definition: Equidistant.cpp:191
aliceVision::camera::Equidistant::project
Vec2 project(const Vec4 &pt, bool applyDistortion=true) const override
Projection of a 3D point into the camera plane (Apply disto (if any) and Intrinsics)
Definition: Equidistant.cpp:43
aliceVision::camera::Equidistant::getDerivativeTransformProjectWrtPoint3
Eigen::Matrix< double, 2, 3 > getDerivativeTransformProjectWrtPoint3(const Eigen::Matrix4d &pose, const Vec4 &pt) const override
Get the derivative of a projection of a 3D point into the camera plane.
Definition: Equidistant.cpp:67
aliceVision::geometry::Pose3
Definition: Pose3.hpp:18