Berkeley SfM
Public Member Functions | Private Attributes | List of all members
bsfm::CameraIntrinsics Class Reference

#include <camera_intrinsics.h>

Public Member Functions

 CameraIntrinsics ()
 
 CameraIntrinsics (const Matrix3d &K, int image_width, int image_height)
 
 CameraIntrinsics (int image_left, int image_top, int image_width, int image_height, double f_u, double f_v, double c_u, double c_v, double k1, double k2, double k3, double k4, double k5)
 
void SetImageLeft (int image_left)
 
void SetImageTop (int image_top)
 
void SetImageWidth (int image_width)
 
void SetImageHeight (int image_height)
 
void SetFU (double f_u)
 
void SetFV (double f_v)
 
void SetCU (double c_u)
 
void SetCV (double c_v)
 
void SetK (double k1, double k2, double k3, double k4, double k5)
 
void SetK1 (double k1)
 
void SetK2 (double k2)
 
void SetK3 (double k3)
 
void SetK4 (double k4)
 
void SetK5 (double k5)
 
void SetHorizontalFOV (double horizontal_fov)
 
void SetVerticalFOV (double vertical_fov)
 
int ImageLeft () const
 
int ImageTop () const
 
int ImageWidth () const
 
int ImageHeight () const
 
double f_u () const
 
double f_v () const
 
double c_u () const
 
double c_v () const
 
double k1 () const
 
double k2 () const
 
double k3 () const
 
double k4 () const
 
double k5 () const
 
double HorizontalFOV () const
 
double VerticalFOV () const
 
Matrix3d K () const
 
Matrix3d Kinv () const
 
bool PointInImage (double u, double v) const
 
bool CameraToImage (double cx, double cy, double cz, double *u_distorted, double *v_distorted) const
 
bool DirectionToImage (double u_normalized, double v_normalized, double *u_distorted, double *v_distorted) const
 
void ImageToDirection (double u_distorted, double v_distorted, double *u_normalized, double *v_normalized) const
 
void Distort (double u, double v, double *u_distorted, double *v_distorted) const
 
void Undistort (double u_distorted, double v_distorted, double *u, double *v, int iterations=10) const
 

Private Attributes

int image_left_
 
int image_top_
 
int image_width_
 
int image_height_
 
double f_u_
 
double f_v_
 
double c_u_
 
double c_v_
 
double k1_
 
double k2_
 
double k3_
 
double k4_
 
double k5_
 
double horizontal_fov_
 
double vertical_fov_
 

Detailed Description

Definition at line 60 of file camera_intrinsics.h.

Constructor & Destructor Documentation

bsfm::CameraIntrinsics::CameraIntrinsics ( )

Definition at line 57 of file camera_intrinsics.cpp.

bsfm::CameraIntrinsics::CameraIntrinsics ( const Matrix3d &  K,
int  image_width,
int  image_height 
)

Definition at line 75 of file camera_intrinsics.cpp.

77  : image_left_(0),
78  image_top_(0),
79  image_width_(image_width),
80  image_height_(image_height),
81  f_u_(K(0, 0)),
82  f_v_(K(1, 1)),
83  c_u_(K(0, 2)),
84  c_v_(K(1, 2)),
85  k1_(0.0),
86  k2_(0.0),
87  k3_(0.0),
88  k4_(0.0),
89  k5_(0.0) {
90  horizontal_fov_ = 2.0 * atan2(0.5 * image_width_, f_u_);
91  vertical_fov_ = 2.0 * atan2(0.5 * image_height_, f_v_);
92 }
bsfm::CameraIntrinsics::CameraIntrinsics ( int  image_left,
int  image_top,
int  image_width,
int  image_height,
double  f_u,
double  f_v,
double  c_u,
double  c_v,
double  k1,
double  k2,
double  k3,
double  k4,
double  k5 
)

Definition at line 95 of file camera_intrinsics.cpp.

100  : image_left_(image_left),
101  image_top_(image_top),
102  image_width_(image_width),
103  image_height_(image_height),
104  f_u_(f_u),
105  f_v_(f_v),
106  c_u_(c_u),
107  c_v_(c_v),
108  k1_(k1),
109  k2_(k2),
110  k3_(k3),
111  k4_(k4),
112  k5_(k5) {
113  horizontal_fov_ = 2.0 * atan2(0.5 * image_width_, f_u_);
114  vertical_fov_ = 2.0 * atan2(0.5 * image_height_, f_v_);
115 }

Member Function Documentation

double bsfm::CameraIntrinsics::c_u ( ) const

Definition at line 218 of file camera_intrinsics.cpp.

218  {
219  return c_u_;
220 }
double bsfm::CameraIntrinsics::c_v ( ) const

Definition at line 222 of file camera_intrinsics.cpp.

222  {
223  return c_v_;
224 }
bool bsfm::CameraIntrinsics::CameraToImage ( double  cx,
double  cy,
double  cz,
double *  u_distorted,
double *  v_distorted 
) const

Definition at line 275 of file camera_intrinsics.cpp.

277  {
278  CHECK_NOTNULL(u_distorted);
279  CHECK_NOTNULL(v_distorted);
280 
281  // We can't project points that lie behind the camera.
282  if (cz < 0.0) return false;
283 
284  // Convert the camera frame point into a normalized direction vector (see
285  // OpenCV help page at the top of this file).
286  const double u_normalized = cx / cz;
287  const double v_normalized = cy / cz;
288 
289  return DirectionToImage(u_normalized, v_normalized, u_distorted, v_distorted);
290 }
bool DirectionToImage(double u_normalized, double v_normalized, double *u_distorted, double *v_distorted) const
bool bsfm::CameraIntrinsics::DirectionToImage ( double  u_normalized,
double  v_normalized,
double *  u_distorted,
double *  v_distorted 
) const

Definition at line 292 of file camera_intrinsics.cpp.

295  {
296  CHECK_NOTNULL(u_distorted);
297  CHECK_NOTNULL(v_distorted);
298 
299  // Distort the normalized direction vector;
300  double u = 0.0, v = 0.0;
301  Distort(u_normalized, v_normalized, &u, &v);
302 
303  // Make a homogeneous vector from the output.
304  Vector3d p;
305  p << u, v, 1.0;
306 
307  // Multiply the distorted direction vector by camera intrinsic matrix to get
308  // the image space point.
309  const Vector3d p_out = CameraIntrinsics::K() * p;
310  *u_distorted = p_out(0);
311  *v_distorted = p_out(1);
312 
313  // Make sure that the resulting point is in the image.
314  return PointInImage(*u_distorted, *v_distorted);
315 }
bool PointInImage(double u, double v) const
void Distort(double u, double v, double *u_distorted, double *v_distorted) const
void bsfm::CameraIntrinsics::Distort ( double  u,
double  v,
double *  u_distorted,
double *  v_distorted 
) const

Definition at line 336 of file camera_intrinsics.cpp.

337  {
338  CHECK_NOTNULL(u_distorted);
339  CHECK_NOTNULL(v_distorted);
340 
341  // Get the camera's radial distortion (see OpenCV help page at the top of
342  // this file).
343  const double r_sq = u * u + v * v;
344  const double radial_dist =
345  1.0 + k1_ * r_sq + k2_ * r_sq * r_sq + k5_ * r_sq * r_sq * r_sq;
346 
347  // If radial distortion is too extreme, our 5th-order model might not be a
348  // good fit. Instead, estimate the distortion with a simpler model (linear),
349  // and apply radial corrections.
350  if (radial_dist < 0.85 || radial_dist > 1.15) {
351  // Distortion too extreme. Warp the point with estimated radial
352  // distortion.
353  const double radius = hypot(image_width_, image_height_);
354  *u_distorted = u / sqrt(r_sq) * radius;
355  *v_distorted = v / sqrt(r_sq) * radius;
356  } else {
357  // Compute radial distortion with 5th order model.
358  const double dx0 = 2.0 * k3_ * u * v + k4_ * (r_sq + 2.0 * u * u);
359  const double dx1 = k3_ * (r_sq + 2.0 * v * v) + 2.0 * k4_ * u * v;
360 
361  // Homogeneous distorted direction vector.
362  *u_distorted = radial_dist * u + dx0;
363  *v_distorted = radial_dist * v + dx1;
364  }
365 }
double bsfm::CameraIntrinsics::f_u ( ) const

Definition at line 210 of file camera_intrinsics.cpp.

210  {
211  return f_u_;
212 }
double bsfm::CameraIntrinsics::f_v ( ) const

Definition at line 214 of file camera_intrinsics.cpp.

214  {
215  return f_v_;
216 }
double bsfm::CameraIntrinsics::HorizontalFOV ( ) const

Definition at line 246 of file camera_intrinsics.cpp.

246  {
247  return horizontal_fov_;
248 }
int bsfm::CameraIntrinsics::ImageHeight ( ) const

Definition at line 206 of file camera_intrinsics.cpp.

206  {
207  return image_height_;
208 }
int bsfm::CameraIntrinsics::ImageLeft ( ) const

Definition at line 194 of file camera_intrinsics.cpp.

194  {
195  return image_left_;
196 }
void bsfm::CameraIntrinsics::ImageToDirection ( double  u_distorted,
double  v_distorted,
double *  u_normalized,
double *  v_normalized 
) const

Definition at line 317 of file camera_intrinsics.cpp.

319  {
320  CHECK_NOTNULL(u_normalized);
321  CHECK_NOTNULL(v_normalized);
322 
323  // Make a homogeneous image space point.
324  Vector3d p_distorted;
325  p_distorted << u_distorted, v_distorted, 1.0;
326 
327  // Multiply the distorted homogeneous image space point by the inverse
328  // of the camera intrinsic matrix to get a distorted ray.
329  const Vector3d p = CameraIntrinsics::Kinv() * p_distorted;
330 
331  // Undistort the ray to get the normalized direction vector.
332  Undistort(p(0), p(1), u_normalized, v_normalized);
333 }
void Undistort(double u_distorted, double v_distorted, double *u, double *v, int iterations=10) const
int bsfm::CameraIntrinsics::ImageTop ( ) const

Definition at line 198 of file camera_intrinsics.cpp.

198  {
199  return image_top_;
200 }
int bsfm::CameraIntrinsics::ImageWidth ( ) const

Definition at line 202 of file camera_intrinsics.cpp.

202  {
203  return image_width_;
204 }
Matrix3d bsfm::CameraIntrinsics::K ( ) const

Definition at line 255 of file camera_intrinsics.cpp.

255  {
256  Matrix3d K;
257  K << f_u_, 0.0, c_u_, 0.0, f_v_, c_v_, 0.0, 0.0, 1.0;
258 
259  return K;
260 }
double bsfm::CameraIntrinsics::k1 ( ) const

Definition at line 226 of file camera_intrinsics.cpp.

226  {
227  return k1_;
228 }
double bsfm::CameraIntrinsics::k2 ( ) const

Definition at line 230 of file camera_intrinsics.cpp.

230  {
231  return k2_;
232 }
double bsfm::CameraIntrinsics::k3 ( ) const

Definition at line 234 of file camera_intrinsics.cpp.

234  {
235  return k3_;
236 }
double bsfm::CameraIntrinsics::k4 ( ) const

Definition at line 238 of file camera_intrinsics.cpp.

238  {
239  return k4_;
240 }
double bsfm::CameraIntrinsics::k5 ( ) const

Definition at line 242 of file camera_intrinsics.cpp.

242  {
243  return k5_;
244 }
Matrix3d bsfm::CameraIntrinsics::Kinv ( ) const

Definition at line 263 of file camera_intrinsics.cpp.

263  {
264  return CameraIntrinsics::K().inverse();
265 }
bool bsfm::CameraIntrinsics::PointInImage ( double  u,
double  v 
) const

Definition at line 268 of file camera_intrinsics.cpp.

268  {
269  const bool in_cols = u >= image_left_ && u < image_left_ + image_width_;
270  const bool in_rows = v >= image_top_ && v < image_top_ + image_height_;
271  return in_cols && in_rows;
272 }
void bsfm::CameraIntrinsics::SetCU ( double  c_u)

Definition at line 146 of file camera_intrinsics.cpp.

146  {
147  c_u_ = c_u;
148 }
void bsfm::CameraIntrinsics::SetCV ( double  c_v)

Definition at line 150 of file camera_intrinsics.cpp.

150  {
151  c_v_ = c_v;
152 }
void bsfm::CameraIntrinsics::SetFU ( double  f_u)

Definition at line 136 of file camera_intrinsics.cpp.

136  {
137  f_u_ = f_u;
138  horizontal_fov_ = 2.0 * atan2(0.5 * image_width_, f_u_);
139 }
void bsfm::CameraIntrinsics::SetFV ( double  f_v)

Definition at line 141 of file camera_intrinsics.cpp.

141  {
142  f_v_ = f_v;
143  vertical_fov_ = 2.0 * atan2(0.5 * image_height_, f_v_);
144 }
void bsfm::CameraIntrinsics::SetHorizontalFOV ( double  horizontal_fov)

Definition at line 183 of file camera_intrinsics.cpp.

183  {
184  horizontal_fov_ = horizontal_fov;
185  f_u_ = 0.5 * image_width_ / tan(0.5 * horizontal_fov_);
186 }
void bsfm::CameraIntrinsics::SetImageHeight ( int  image_height)

Definition at line 131 of file camera_intrinsics.cpp.

131  {
132  image_height_ = image_height;
133  vertical_fov_ = 2.0 * atan2(0.5 * image_height_, f_v_);
134 }
void bsfm::CameraIntrinsics::SetImageLeft ( int  image_left)

Definition at line 118 of file camera_intrinsics.cpp.

118  {
119  image_left_ = image_left;
120 }
void bsfm::CameraIntrinsics::SetImageTop ( int  image_top)

Definition at line 122 of file camera_intrinsics.cpp.

122  {
123  image_top_ = image_top;
124 }
void bsfm::CameraIntrinsics::SetImageWidth ( int  image_width)

Definition at line 126 of file camera_intrinsics.cpp.

126  {
127  image_width_ = image_width;
128  horizontal_fov_ = 2.0 * atan2(0.5 * image_width_, f_u_);
129 }
void bsfm::CameraIntrinsics::SetK ( double  k1,
double  k2,
double  k3,
double  k4,
double  k5 
)

Definition at line 154 of file camera_intrinsics.cpp.

void bsfm::CameraIntrinsics::SetK1 ( double  k1)

Definition at line 163 of file camera_intrinsics.cpp.

163  {
164  k1_ = k1;
165 }
void bsfm::CameraIntrinsics::SetK2 ( double  k2)

Definition at line 167 of file camera_intrinsics.cpp.

167  {
168  k2_ = k2;
169 }
void bsfm::CameraIntrinsics::SetK3 ( double  k3)

Definition at line 171 of file camera_intrinsics.cpp.

171  {
172  k3_ = k3;
173 }
void bsfm::CameraIntrinsics::SetK4 ( double  k4)

Definition at line 175 of file camera_intrinsics.cpp.

175  {
176  k4_ = k4;
177 }
void bsfm::CameraIntrinsics::SetK5 ( double  k5)

Definition at line 179 of file camera_intrinsics.cpp.

179  {
180  k5_ = k5;
181 }
void bsfm::CameraIntrinsics::SetVerticalFOV ( double  vertical_fov)

Definition at line 188 of file camera_intrinsics.cpp.

188  {
189  vertical_fov_ = vertical_fov;
190  f_v_ = 0.5 * image_height_ / tan(0.5 * vertical_fov_);
191 }
void bsfm::CameraIntrinsics::Undistort ( double  u_distorted,
double  v_distorted,
double *  u,
double *  v,
int  iterations = 10 
) const

Definition at line 368 of file camera_intrinsics.cpp.

369  {
370  CHECK_NOTNULL(u);
371  CHECK_NOTNULL(v);
372 
373  // Iteratively attempt to undo the radial distortion (see OpenCV help page
374  // at the top of this file).
375  double u_refine = u_distorted;
376  double v_refine = v_distorted;
377  for (int i = 0; i < iterations; ++i) {
378  const double r_sq = u_refine * u_refine + v_refine * v_refine;
379  const double dx0 = 2.0 * k3_ * u_refine * v_refine +
380  k4_ * (r_sq + 2.0 * u_refine * u_refine);
381  const double dx1 = k3_ * (r_sq + 2.0 * v_refine * v_refine) +
382  2.0 * k4_ * u_refine * v_refine;
383  u_refine = u_distorted - dx0;
384  v_refine = v_distorted - dx1;
385  }
386 
387  // Return the undistorted direction vector.
388  *u = u_refine;
389  *v = v_refine;
390 }
double bsfm::CameraIntrinsics::VerticalFOV ( ) const

Definition at line 250 of file camera_intrinsics.cpp.

250  {
251  return vertical_fov_;
252 }

Member Data Documentation

double bsfm::CameraIntrinsics::c_u_
private

Definition at line 146 of file camera_intrinsics.h.

double bsfm::CameraIntrinsics::c_v_
private

Definition at line 147 of file camera_intrinsics.h.

double bsfm::CameraIntrinsics::f_u_
private

Definition at line 144 of file camera_intrinsics.h.

double bsfm::CameraIntrinsics::f_v_
private

Definition at line 145 of file camera_intrinsics.h.

double bsfm::CameraIntrinsics::horizontal_fov_
private

Definition at line 153 of file camera_intrinsics.h.

int bsfm::CameraIntrinsics::image_height_
private

Definition at line 143 of file camera_intrinsics.h.

int bsfm::CameraIntrinsics::image_left_
private

Definition at line 140 of file camera_intrinsics.h.

int bsfm::CameraIntrinsics::image_top_
private

Definition at line 141 of file camera_intrinsics.h.

int bsfm::CameraIntrinsics::image_width_
private

Definition at line 142 of file camera_intrinsics.h.

double bsfm::CameraIntrinsics::k1_
private

Definition at line 148 of file camera_intrinsics.h.

double bsfm::CameraIntrinsics::k2_
private

Definition at line 149 of file camera_intrinsics.h.

double bsfm::CameraIntrinsics::k3_
private

Definition at line 150 of file camera_intrinsics.h.

double bsfm::CameraIntrinsics::k4_
private

Definition at line 151 of file camera_intrinsics.h.

double bsfm::CameraIntrinsics::k5_
private

Definition at line 152 of file camera_intrinsics.h.

double bsfm::CameraIntrinsics::vertical_fov_
private

Definition at line 154 of file camera_intrinsics.h.


The documentation for this class was generated from the following files: