AliceVision
Photogrammetric Computer Vision Framework
IntrinsicScaleOffset.hpp
1 // This file is part of the AliceVision project.
2 // Copyright (c) 2016 AliceVision contributors.
3 // Copyright (c) 2012 openMVG contributors.
4 // This Source Code Form is subject to the terms of the Mozilla Public License,
5 // v. 2.0. If a copy of the MPL was not distributed with this file,
6 // You can obtain one at https://mozilla.org/MPL/2.0/.
7 
8 #pragma once
9 
10 #include "IntrinsicBase.hpp"
11 
12 namespace aliceVision {
13 namespace camera {
14 
19 {
20  public:
21  IntrinsicScaleOffset(unsigned int w, unsigned int h, double scaleX, double scaleY, double offsetX, double offsetY)
22  : IntrinsicBase(w, h),
23  _scale(scaleX, scaleY),
24  _offset(offsetX, offsetY)
25  {}
26 
27  ~IntrinsicScaleOffset() override = default;
28 
29  static std::shared_ptr<IntrinsicScaleOffset> cast(std::shared_ptr<IntrinsicBase> sptr);
30 
31  void copyFrom(const IntrinsicScaleOffset& other) { *this = other; }
32 
33  bool operator==(const IntrinsicBase& otherBase) const override;
34 
35  void setScale(const Vec2& scale) { _scale = scale; }
36 
37  inline Vec2 getScale() const { return _scale; }
38 
39  void setOffset(const Vec2& offset) { _offset = offset; }
40 
41  inline Vec2 getOffset() const { return _offset; }
42 
46  inline const Vec2 getPrincipalPoint() const
47  {
48  Vec2 ret = _offset;
49  ret(0) += static_cast<double>(_w) * 0.5;
50  ret(1) += static_cast<double>(_h) * 0.5;
51 
52  return ret;
53  }
54 
55  // Transform a point from the camera plane to the image plane
56  Vec2 cam2ima(const Vec2& p) const override;
57 
58  virtual Eigen::Matrix2d getDerivativeCam2ImaWrtScale(const Vec2& p) const;
59 
60  virtual Eigen::Matrix2d getDerivativeCam2ImaWrtPoint() const;
61 
62  virtual Eigen::Matrix2d getDerivativeCam2ImaWrtPrincipalPoint() const;
63 
64  // Transform a point from the image plane to the camera plane
65  Vec2 ima2cam(const Vec2& p) const override;
66 
67  virtual Eigen::Matrix<double, 2, 2> getDerivativeIma2CamWrtScale(const Vec2& p) const;
68 
69  virtual Eigen::Matrix2d getDerivativeIma2CamWrtPoint() const;
70 
71  virtual Eigen::Matrix2d getDerivativeIma2CamWrtPrincipalPoint() const;
72 
78  void rescale(float factorW, float factorH) override;
79 
80  // Data wrapper for non linear optimization (update from data)
81  bool updateFromParams(const std::vector<double>& params) override;
82 
89  bool importFromParams(const std::vector<double>& params, const Version& inputVersion) override;
90 
94  inline void setInitialScale(const Vec2& initialScale) { _initialScale = initialScale; }
95 
100  inline Vec2 getInitialScale() const { return _initialScale; }
101 
106  inline void setRatioLocked(bool lock) { _ratioLocked = lock; }
107 
108  inline bool isRatioLocked() const { return _ratioLocked; }
109 
114  inline void setOffsetLocked(bool lock) { _offsetLocked = lock; }
115 
116  inline bool isOffsetLocked() const { return _offsetLocked; }
117 
122  inline void setScaleLocked(bool lock) { _scaleLocked = lock; }
123 
124  inline bool isScaleLocked() const { return _scaleLocked; }
125 
130  double getFocalLength() const;
131 
136  double getInitialFocalLength() const;
137 
142  double getPixelAspectRatio() const;
143 
150  void setFocalLength(double focalLengthMM, double pixelAspectRatio, bool useCompatibility = false);
151 
158  void setInitialFocalLength(double initialFocalLengthMM, double pixelAspectRatio, bool useCompatibility = false);
159 
160  protected:
161  bool _ratioLocked{true};
162  bool _offsetLocked{false};
163  bool _scaleLocked{false};
164  Vec2 _scale{1.0, 1.0};
165  Vec2 _offset{0.0, 0.0};
166  Vec2 _initialScale{-1.0, -1.0};
167 };
168 
169 } // namespace camera
170 } // namespace aliceVision
aliceVision::camera::IntrinsicScaleOffset::rescale
void rescale(float factorW, float factorH) override
Rescale intrinsics to reflect a rescale of the camera image.
Definition: IntrinsicScaleOffset.cpp:104
aliceVision::camera::IntrinsicScaleOffset::getPrincipalPoint
const Vec2 getPrincipalPoint() const
Principal point in image coordinate ((0,0) is image top-left).
Definition: IntrinsicScaleOffset.hpp:46
aliceVision::camera::IntrinsicScaleOffset::operator==
bool operator==(const IntrinsicBase &otherBase) const override
operator ==
Definition: IntrinsicScaleOffset.cpp:14
aliceVision::camera::IntrinsicScaleOffset::getInitialFocalLength
double getInitialFocalLength() const
get initial focal length in mm
Definition: IntrinsicScaleOffset.cpp:183
aliceVision::camera::IntrinsicScaleOffset::updateFromParams
bool updateFromParams(const std::vector< double > &params) override
Update intrinsic parameters.
Definition: IntrinsicScaleOffset.cpp:116
aliceVision::camera::IntrinsicScaleOffset::ima2cam
Vec2 ima2cam(const Vec2 &p) const override
Transform a point from the image plane to the camera plane.
Definition: IntrinsicScaleOffset.cpp:60
aliceVision::camera::IntrinsicScaleOffset::getPixelAspectRatio
double getPixelAspectRatio() const
estimate the pixel aspect ratio
Definition: IntrinsicScaleOffset.cpp:207
aliceVision::camera::IntrinsicBase::h
unsigned int h() const
Get the intrinsic image height.
Definition: IntrinsicBase.hpp:58
aliceVision::camera::IntrinsicBase::lock
void lock()
Lock the intrinsic.
Definition: IntrinsicBase.hpp:207
aliceVision
Definition: checkerDetector.cpp:32
aliceVision::camera::IntrinsicBase::w
unsigned int w() const
Get the intrinsic image width.
Definition: IntrinsicBase.hpp:52
aliceVision::camera::IntrinsicScaleOffset::setRatioLocked
void setRatioLocked(bool lock)
Lock the ratio between fx and fy.
Definition: IntrinsicScaleOffset.hpp:106
aliceVision::camera::IntrinsicScaleOffset::importFromParams
bool importFromParams(const std::vector< double > &params, const Version &inputVersion) override
Import a vector of params loaded from a file. It is similar to updateFromParams but it deals with fil...
Definition: IntrinsicScaleOffset.cpp:131
aliceVision::camera::IntrinsicScaleOffset::setInitialScale
void setInitialScale(const Vec2 &initialScale)
Set the initial scale for the intrinsic (used to constrain minimization)
Definition: IntrinsicScaleOffset.hpp:94
aliceVision::camera::IntrinsicScaleOffset::setFocalLength
void setFocalLength(double focalLengthMM, double pixelAspectRatio, bool useCompatibility=false)
Definition: IntrinsicScaleOffset.cpp:218
aliceVision::camera::IntrinsicScaleOffset::setOffsetLocked
void setOffsetLocked(bool lock)
Lock the offset.
Definition: IntrinsicScaleOffset.hpp:114
aliceVision::Version
Definition: version.hpp:30
aliceVision::camera::IntrinsicScaleOffset::cam2ima
Vec2 cam2ima(const Vec2 &p) const override
Transform a point from the camera plane to the image plane.
Definition: IntrinsicScaleOffset.cpp:36
aliceVision::camera::IntrinsicScaleOffset::setScaleLocked
void setScaleLocked(bool lock)
Lock the scale.
Definition: IntrinsicScaleOffset.hpp:122
aliceVision::camera::IntrinsicScaleOffset::getInitialScale
Vec2 getInitialScale() const
Get the intrinsic initial scale.
Definition: IntrinsicScaleOffset.hpp:100
aliceVision::camera::IntrinsicBase
Basis class for all intrinsic parameters of a camera.
Definition: IntrinsicBase.hpp:27
aliceVision::camera::IntrinsicScaleOffset::getFocalLength
double getFocalLength() const
get focal length in mm
Definition: IntrinsicScaleOffset.cpp:164
aliceVision::camera::IntrinsicScaleOffset::setInitialFocalLength
void setInitialFocalLength(double initialFocalLengthMM, double pixelAspectRatio, bool useCompatibility=false)
Definition: IntrinsicScaleOffset.cpp:237
aliceVision::camera::IntrinsicScaleOffset
Class with "focal" (scale) and center offset.
Definition: IntrinsicScaleOffset.hpp:18