Assorted camera tracker improvements
[blender.git] / extern / libmv / libmv / simple_pipeline / camera_intrinsics.h
1 // Copyright (c) 2011 libmv authors.
2 //
3 // Permission is hereby granted, free of charge, to any person obtaining a copy
4 // of this software and associated documentation files (the "Software"), to
5 // deal in the Software without restriction, including without limitation the
6 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7 // sell copies of the Software, and to permit persons to whom the Software is
8 // furnished to do so, subject to the following conditions:
9 //
10 // The above copyright notice and this permission notice shall be included in
11 // all copies or substantial portions of the Software.
12 //
13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19 // IN THE SOFTWARE.
20
21 #ifndef LIBMV_SIMPLE_PIPELINE_CAMERA_INTRINSICS_H_
22 #define LIBMV_SIMPLE_PIPELINE_CAMERA_INTRINSICS_H_
23
24 #include <iostream>
25 #include <string>
26
27 #include <Eigen/Core>
28
29 namespace libmv {
30
31 typedef Eigen::Matrix<double, 3, 3> Mat3;
32
33 struct Grid;
34
35 class CameraIntrinsics {
36  public:
37   CameraIntrinsics();
38   CameraIntrinsics(const CameraIntrinsics &from);
39   ~CameraIntrinsics();
40
41   const Mat3 &K()                 const { return K_;            }
42   double      focal_length()      const { return K_(0, 0);      }
43   double      focal_length_x()    const { return K_(0, 0);      }
44   double      focal_length_y()    const { return K_(1, 1);      }
45   double      principal_point_x() const { return K_(0, 2);      }
46   double      principal_point_y() const { return K_(1, 2);      }
47   int         image_width()       const { return image_width_;  }
48   int         image_height()      const { return image_height_; }
49   double      k1()                const { return k1_; }
50   double      k2()                const { return k2_; }
51   double      k3()                const { return k3_; }
52   double      p1()                const { return p1_; }
53   double      p2()                const { return p2_; }
54
55   /// Set the entire calibration matrix at once.
56   void SetK(const Mat3 new_k);
57
58   /// Set both x and y focal length in pixels.
59   void SetFocalLength(double focal_x, double focal_y);
60
61   /// Set principal point in pixels.
62   void SetPrincipalPoint(double cx, double cy);
63
64   /// Set the image size in pixels.
65   void SetImageSize(int width, int height);
66
67   void SetRadialDistortion(double k1, double k2, double k3 = 0);
68
69   void SetTangentialDistortion(double p1, double p2);
70
71   /*!
72       Apply camera intrinsics to the normalized point to get image coordinates.
73
74       This applies the lens distortion to a point which is in normalized
75       camera coordinates (i.e. the principal point is at (0, 0)) to get image
76       coordinates in pixels.
77   */
78   void ApplyIntrinsics(double normalized_x, double normalized_y,
79                        double *image_x, double *image_y) const;
80
81   /*!
82       Invert camera intrinsics on the image point to get normalized coordinates.
83
84       This reverses the effect of lens distortion on a point which is in image
85       coordinates to get normalized camera coordinates.
86   */
87   void InvertIntrinsics(double image_x, double image_y,
88                         double *normalized_x, double *normalized_y) const;
89
90   /*!
91       Distort an image using the current camera instrinsics
92
93       The distorted image is computed in \a dst using samples from \a src.
94       both buffers should be \a width x \a height x \a channels sized.
95
96       \note This is the reference implementation using floating point images.
97   */
98   void Distort(const float* src, float* dst,
99                int width, int height, double overscan, int channels);
100
101   /*!
102       Distort an image using the current camera instrinsics
103
104       The distorted image is computed in \a dst using samples from \a src.
105       both buffers should be \a width x \a height x \a channels sized.
106
107       \note This version is much faster.
108   */
109   void Distort(const unsigned char* src, unsigned char* dst,
110                int width, int height, double overscan, int channels);
111
112   /*!
113       Undistort an image using the current camera instrinsics
114
115       The undistorted image is computed in \a dst using samples from \a src.
116       both buffers should be \a width x \a height x \a channels sized.
117
118       \note This is the reference implementation using floating point images.
119   */
120   void Undistort(const float* src, float* dst,
121                  int width, int height, double overscan, int channels);
122
123   /*!
124       Undistort an image using the current camera instrinsics
125
126       The undistorted image is computed in \a dst using samples from \a src.
127       both buffers should be \a width x \a height x \a channels sized.
128
129       \note This version is much faster.
130   */
131   void Undistort(const unsigned char* src, unsigned char* dst,
132                  int width, int height, double overscan, int channels);
133
134  private:
135   template<typename WarpFunction> void ComputeLookupGrid(struct Grid* grid, int width, int height, double overscan);
136   void CheckUndistortLookupGrid(int width, int height, double overscan);
137   void CheckDistortLookupGrid(int width, int height, double overscan);
138   void FreeLookupGrid();
139
140   // The traditional intrinsics matrix from x = K[R|t]X.
141   Mat3 K_;
142
143   // This is the size of the image. This is necessary to, for example, handle
144   // the case of processing a scaled image.
145   int image_width_;
146   int image_height_;
147
148   // OpenCV's distortion model with third order polynomial radial distortion
149   // terms and second order tangential distortion. The distortion is applied to
150   // the normalized coordinates before the focal length, which makes them
151   // independent of image size.
152   double k1_, k2_, k3_, p1_, p2_;
153
154   struct Grid *distort_;
155   struct Grid *undistort_;
156 };
157
158 /// A human-readable representation of the camera intrinsic parameters.
159 std::ostream& operator <<(std::ostream &os,
160                           const CameraIntrinsics &intrinsics);
161
162 }  // namespace libmv
163
164 #endif  // LIBMV_SIMPLE_PIPELINE_CAMERA_INTRINSICS_H_