AliceVision
Photogrammetric Computer Vision Framework
Equirectangular.hpp
1 // This file is part of the AliceVision project.
2 // Copyright (c) 2025 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:
32  : Equirectangular(1, 1, 1.0, 1.0, 0.0, 0.0)
33  {}
34 
35  Equirectangular(unsigned int w, unsigned int h, double focalLengthPixX, double focalLengthPixY, double offsetX, double offsetY)
36  : IntrinsicScaleOffsetDisto(w, h, focalLengthPixX, focalLengthPixY, offsetX, offsetY)
37  {}
38 
39  ~Equirectangular() override = default;
40 
41  Equirectangular* clone() const override { return new Equirectangular(*this); }
42 
43  static std::shared_ptr<Equirectangular> cast(std::shared_ptr<IntrinsicBase> sptr);
44 
45  void assign(const IntrinsicBase& other) override { *this = dynamic_cast<const Equirectangular&>(other); }
46 
47  bool isValid() const override { return _scale(0) > 0 && IntrinsicBase::isValid(); }
48 
49  EINTRINSIC getType() const override;
50 
51  Vec2 transformProject(const Eigen::Matrix4d& pose, const Vec4& pt, bool applyDistortion = true) const override;
52 
53  Vec2 transformProject(const geometry::Pose3& pose, const Vec4& pt3D, bool applyDistortion = true) const
54  {
55  return transformProject(pose.getHomogeneous(), pt3D, applyDistortion);
56  }
57 
58  Vec2 project(const Vec4& pt, bool applyDistortion = true) const override;
59 
60  Eigen::Matrix<double, 2, 3> getDerivativeTransformProjectWrtPoint3(const Eigen::Matrix4d& pose, const Vec4& pt) const override;
61 
62  Eigen::Matrix<double, 2, 3> getDerivativeTransformProjectWrtDisto(const Eigen::Matrix4d& pose, const Vec4& pt) const;
63 
64  Eigen::Matrix<double, 2, 2> getDerivativeTransformProjectWrtScale(const Eigen::Matrix4d& pose, const Vec4& pt) const;
65 
66  Eigen::Matrix<double, 2, 2> getDerivativeTransformProjectWrtPrincipalPoint(const Eigen::Matrix4d& pose, const Vec4& pt) const;
67 
68  Eigen::Matrix<double, 2, Eigen::Dynamic> getDerivativeTransformProjectWrtParams(const Eigen::Matrix4d& pose, const Vec4& pt3D) const override;
69 
70  Eigen::Matrix<double, 2, Eigen::Dynamic> getDerivativeTransformProjectWrtDistortion(const Eigen::Matrix4d& pose, const Vec4& pt) const override;
71 
72  Eigen::Matrix<double, 3, Eigen::Dynamic> getDerivativeBackProjectUnitWrtDistortion(const Vec2& pt2D) const override;
73 
74  Vec3 toUnitSphere(const Vec2& pt) const override;
75 
76  Eigen::Matrix<double, 3, 2> getDerivativetoUnitSphereWrtPoint(const Vec2& pt) const;
77 
83  Eigen::Matrix<double, 3, Eigen::Dynamic> getDerivativeBackProjectUnitWrtParams(const Vec2& pt2D) const override;
84 
85  double imagePlaneToCameraPlaneError(double value) const override;
86 
92  bool isVisibleRay(const Vec3& ray) const override;
93 
98  double getHorizontalFov() const override;
99 
104  double getVerticalFov() const override;
105 
110  double pixelProbability() const override;
111 };
112 
113 } // namespace camera
114 } // namespace aliceVision
aliceVision::camera::Equirectangular::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)
aliceVision::camera::Equirectangular::toUnitSphere
Vec3 toUnitSphere(const Vec2 &pt) const override
Transform a given point (in pixels) to unit sphere in meters.
Definition: Equirectangular.cpp:118
aliceVision::camera::Equirectangular::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: Equirectangular.cpp:108
aliceVision::camera::Equirectangular::getVerticalFov
double getVerticalFov() const override
Get the vertical FOV in radians.
Definition: Equirectangular.cpp:185
aliceVision::camera::Equirectangular::isVisibleRay
bool isVisibleRay(const Vec3 &ray) const override
Return true if this ray should be visible in the image.
Definition: Equirectangular.cpp:179
aliceVision::camera::Equirectangular::assign
void assign(const IntrinsicBase &other) override
Assign object.
Definition: Equirectangular.hpp:45
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::IntrinsicBase::w
unsigned int w() const
Get the intrinsic image width.
Definition: IntrinsicBase.hpp:52
aliceVision::camera::Equirectangular::pixelProbability
double pixelProbability() const override
how a one pixel change relates to an angular change
Definition: Equirectangular.cpp:187
aliceVision::camera::Equirectangular::getType
EINTRINSIC getType() const override
Get embed camera type.
Definition: Equirectangular.cpp:181
aliceVision::camera::IntrinsicScaleOffsetDisto
Class with disto.
Definition: IntrinsicScaleOffsetDisto.hpp:23
aliceVision::camera::Equirectangular::getDerivativeBackProjectUnitWrtParams
Eigen::Matrix< double, 3, Eigen::Dynamic > getDerivativeBackProjectUnitWrtParams(const Vec2 &pt2D) const override
Get the derivative of the unit sphere backprojection.
Definition: Equirectangular.cpp:152
aliceVision::camera::Equirectangular::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: Equirectangular.cpp:47
aliceVision::camera::Equirectangular::getHorizontalFov
double getHorizontalFov() const override
Get the horizontal FOV in radians.
Definition: Equirectangular.cpp:183
aliceVision::camera::Equirectangular
Equirectangular is a camera model used for panoramas. See https://en.wikipedia.org/wiki/Equirectangul...
Definition: Equirectangular.hpp:28
aliceVision::camera::Equirectangular::clone
Equirectangular * clone() const override
Polymorphic clone.
Definition: Equirectangular.hpp:41
aliceVision::camera::Equirectangular::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: Equirectangular.cpp:34
aliceVision::camera::IntrinsicBase
Basis class for all intrinsic parameters of a camera.
Definition: IntrinsicBase.hpp:27
aliceVision::camera::Equirectangular::isValid
bool isValid() const override
Return true if the intrinsic is valid.
Definition: Equirectangular.hpp:47
aliceVision::camera::Equirectangular::imagePlaneToCameraPlaneError
double imagePlaneToCameraPlaneError(double value) const override
Normalize a given unit pixel error to the camera plane.
Definition: Equirectangular.cpp:177
aliceVision::geometry::Pose3
Definition: Pose3.hpp:18