Blender V5.0
libmv/simple_pipeline/camera_intrinsics.cc
Go to the documentation of this file.
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
22
26
27namespace libmv {
28
29namespace internal {
30
32 : offset_(NULL), width_(0), height_(0), overscan_(0.0) {
33}
34
36 : offset_(NULL),
37 width_(from.width_),
38 height_(from.height_),
39 overscan_(from.overscan_) {
40 if (from.offset_) {
41 offset_ = new Offset[width_ * height_];
42 memcpy(offset_, from.offset_, sizeof(Offset) * width_ * height_);
43 }
44}
45
47 delete[] offset_;
48}
49
51 delete[] offset_;
52 offset_ = NULL;
53}
54
55} // namespace internal
56
58 : image_width_(0), image_height_(0), K_(Mat3::Identity()) {
59}
60
62 : image_width_(from.image_width_),
63 image_height_(from.image_height_),
64 K_(from.K_),
65 distort_(from.distort_),
66 undistort_(from.undistort_) {
67}
68
69// Set the image size in pixels.
70void CameraIntrinsics::SetImageSize(int width, int height) {
71 image_width_ = width;
72 image_height_ = height;
74}
75
76// Set the entire calibration matrix at once.
77void CameraIntrinsics::SetK(const Mat3 new_k) {
78 K_ = new_k;
80}
81
82// Set both x and y focal length in pixels.
83void CameraIntrinsics::SetFocalLength(double focal_x, double focal_y) {
84 K_(0, 0) = focal_x;
85 K_(1, 1) = focal_y;
87}
88
89// Set principal point in pixels.
90void CameraIntrinsics::SetPrincipalPoint(double cx, double cy) {
91 K_(0, 2) = cx;
92 K_(1, 2) = cy;
94}
95
97 double image_y,
98 double* normalized_x,
99 double* normalized_y) const {
100 *normalized_x = (image_x - principal_point_x()) / focal_length_x();
101 *normalized_y = (image_y - principal_point_y()) / focal_length_y();
102}
103
105 double normalized_y,
106 double* image_x,
107 double* image_y) const {
108 *image_x = normalized_x * focal_length_x() + principal_point_x();
109 *image_y = normalized_y * focal_length_y() + principal_point_y();
110}
111
112// Reset lookup grids after changing the distortion model.
114 distort_.Reset();
115 undistort_.Reset();
116}
117
118void CameraIntrinsics::Pack(PackedIntrinsics* packed_intrinsics) const {
119 packed_intrinsics->SetFocalLength(focal_length());
120 packed_intrinsics->SetPrincipalPoint(principal_point_x(),
122}
123
124void CameraIntrinsics::Unpack(const PackedIntrinsics& packed_intrinsics) {
125 SetFocalLength(packed_intrinsics.GetFocalLength(),
126 packed_intrinsics.GetFocalLength());
127
128 SetPrincipalPoint(packed_intrinsics.GetPrincipalPointX(),
129 packed_intrinsics.GetPrincipalPointY());
130}
131
132// Polynomial model.
133
138
145
147 double k2,
148 double k3) {
149 parameters_[OFFSET_K1] = k1;
150 parameters_[OFFSET_K2] = k2;
151 parameters_[OFFSET_K3] = k3;
153}
154
156 parameters_[OFFSET_P1] = p1;
157 parameters_[OFFSET_P2] = p2;
159}
160
162 double normalized_y,
163 double* image_x,
164 double* image_y) const {
169 k1(),
170 k2(),
171 k3(),
172 p1(),
173 p2(),
174 normalized_x,
175 normalized_y,
176 image_x,
177 image_y);
178}
179
181 double image_y,
182 double* normalized_x,
183 double* normalized_y) const {
188 k1(),
189 k2(),
190 k3(),
191 p1(),
192 p2(),
193 image_x,
194 image_y,
195 normalized_x,
196 normalized_y);
197}
198
200 PackedIntrinsics* packed_intrinsics) const {
201 CameraIntrinsics::Pack(packed_intrinsics);
202
203 packed_intrinsics->SetK1(k1());
204 packed_intrinsics->SetK2(k2());
205 packed_intrinsics->SetK3(k3());
206
207 packed_intrinsics->SetP1(p1());
208 packed_intrinsics->SetP2(p2());
209}
210
212 const PackedIntrinsics& packed_intrinsics) {
213 CameraIntrinsics::Unpack(packed_intrinsics);
214
215 SetRadialDistortion(packed_intrinsics.GetK1(),
216 packed_intrinsics.GetK2(),
217 packed_intrinsics.GetK3());
218
219 SetTangentialDistortion(packed_intrinsics.GetP1(), packed_intrinsics.GetP2());
220}
221
222// Division model.
223
227
233
235 parameters_[OFFSET_K1] = k1;
236 parameters_[OFFSET_K2] = k2;
238}
239
241 double normalized_y,
242 double* image_x,
243 double* image_y) const {
248 k1(),
249 k2(),
250 normalized_x,
251 normalized_y,
252 image_x,
253 image_y);
254}
255
257 double image_y,
258 double* normalized_x,
259 double* normalized_y) const {
264 k1(),
265 k2(),
266 image_x,
267 image_y,
268 normalized_x,
269 normalized_y);
270}
271
272void DivisionCameraIntrinsics::Pack(PackedIntrinsics* packed_intrinsics) const {
273 CameraIntrinsics::Pack(packed_intrinsics);
274
275 packed_intrinsics->SetK1(k1());
276 packed_intrinsics->SetK2(k2());
277}
278
280 const PackedIntrinsics& packed_intrinsics) {
281 CameraIntrinsics::Unpack(packed_intrinsics);
282
283 SetDistortion(packed_intrinsics.GetK1(), packed_intrinsics.GetK2());
284}
285
286// Nuke model.
287
291
296
298 parameters_[OFFSET_K1] = k1;
299 parameters_[OFFSET_K2] = k2;
301}
302
304 double normalized_y,
305 double* image_x,
306 double* image_y) const {
311 image_width(),
312 image_height(),
313 k1(),
314 k2(),
315 normalized_x,
316 normalized_y,
317 image_x,
318 image_y);
319}
320
322 double image_y,
323 double* normalized_x,
324 double* normalized_y) const {
329 image_width(),
330 image_height(),
331 k1(),
332 k2(),
333 image_x,
334 image_y,
335 normalized_x,
336 normalized_y);
337}
338
339void NukeCameraIntrinsics::Pack(PackedIntrinsics* packed_intrinsics) const {
340 CameraIntrinsics::Pack(packed_intrinsics);
341
342 packed_intrinsics->SetK1(k1());
343 packed_intrinsics->SetK2(k2());
344}
345
346void NukeCameraIntrinsics::Unpack(const PackedIntrinsics& packed_intrinsics) {
347 CameraIntrinsics::Unpack(packed_intrinsics);
348
349 SetDistortion(packed_intrinsics.GetK1(), packed_intrinsics.GetK2());
350}
351
352// Brown model.
353
358
360 : CameraIntrinsics(from) {
361 SetRadialDistortion(from.k1(), from.k2(), from.k3(), from.k4());
362 SetTangentialDistortion(from.p1(), from.p2());
363}
364
366 double k2,
367 double k3,
368 double k4) {
369 parameters_[OFFSET_K1] = k1;
370 parameters_[OFFSET_K2] = k2;
371 parameters_[OFFSET_K3] = k3;
372 parameters_[OFFSET_K4] = k4;
374}
375
377 parameters_[OFFSET_P1] = p1;
378 parameters_[OFFSET_P2] = p2;
380}
381
383 double normalized_y,
384 double* image_x,
385 double* image_y) const {
390 k1(),
391 k2(),
392 k3(),
393 k4(),
394 p1(),
395 p2(),
396 normalized_x,
397 normalized_y,
398 image_x,
399 image_y);
400}
401
403 double image_y,
404 double* normalized_x,
405 double* normalized_y) const {
410 k1(),
411 k2(),
412 k3(),
413 k4(),
414 p1(),
415 p2(),
416 image_x,
417 image_y,
418 normalized_x,
419 normalized_y);
420}
421
422void BrownCameraIntrinsics::Pack(PackedIntrinsics* packed_intrinsics) const {
423 CameraIntrinsics::Pack(packed_intrinsics);
424
425 packed_intrinsics->SetK1(k1());
426 packed_intrinsics->SetK2(k2());
427 packed_intrinsics->SetK3(k3());
428 packed_intrinsics->SetK4(k4());
429
430 packed_intrinsics->SetP1(p1());
431 packed_intrinsics->SetP2(p2());
432}
433
434void BrownCameraIntrinsics::Unpack(const PackedIntrinsics& packed_intrinsics) {
435 CameraIntrinsics::Unpack(packed_intrinsics);
436
437 SetRadialDistortion(packed_intrinsics.GetK1(),
438 packed_intrinsics.GetK2(),
439 packed_intrinsics.GetK3(),
440 packed_intrinsics.GetK4());
441
442 SetTangentialDistortion(packed_intrinsics.GetP1(), packed_intrinsics.GetP2());
443}
444
445std::ostream& operator<<(std::ostream& os, const CameraIntrinsics& intrinsics) {
446 if (intrinsics.focal_length_x() == intrinsics.focal_length_x()) {
447 os << "f=" << intrinsics.focal_length();
448 } else {
449 os << "fx=" << intrinsics.focal_length_x()
450 << " fy=" << intrinsics.focal_length_y();
451 }
452 os << " cx=" << intrinsics.principal_point_x()
453 << " cy=" << intrinsics.principal_point_y()
454 << " w=" << intrinsics.image_width() << " h=" << intrinsics.image_height();
455
456#define PRINT_NONZERO_COEFFICIENT(intrinsics, coeff) \
457 { \
458 if (intrinsics->coeff() != 0.0) { \
459 os << " " #coeff "=" << intrinsics->coeff(); \
460 } \
461 } \
462 (void)0
463
464 switch (intrinsics.GetDistortionModelType()) {
466 const PolynomialCameraIntrinsics* polynomial_intrinsics =
467 static_cast<const PolynomialCameraIntrinsics*>(&intrinsics);
468 PRINT_NONZERO_COEFFICIENT(polynomial_intrinsics, k1);
469 PRINT_NONZERO_COEFFICIENT(polynomial_intrinsics, k2);
470 PRINT_NONZERO_COEFFICIENT(polynomial_intrinsics, k3);
471 PRINT_NONZERO_COEFFICIENT(polynomial_intrinsics, p1);
472 PRINT_NONZERO_COEFFICIENT(polynomial_intrinsics, p2);
473 break;
474 }
476 const DivisionCameraIntrinsics* division_intrinsics =
477 static_cast<const DivisionCameraIntrinsics*>(&intrinsics);
478 PRINT_NONZERO_COEFFICIENT(division_intrinsics, k1);
479 PRINT_NONZERO_COEFFICIENT(division_intrinsics, k2);
480 break;
481 }
483 const NukeCameraIntrinsics* nuke_intrinsics =
484 static_cast<const NukeCameraIntrinsics*>(&intrinsics);
485 PRINT_NONZERO_COEFFICIENT(nuke_intrinsics, k1);
486 PRINT_NONZERO_COEFFICIENT(nuke_intrinsics, k2);
487 break;
488 }
490 const BrownCameraIntrinsics* brown_intrinsics =
491 static_cast<const BrownCameraIntrinsics*>(&intrinsics);
492 PRINT_NONZERO_COEFFICIENT(brown_intrinsics, k1);
493 PRINT_NONZERO_COEFFICIENT(brown_intrinsics, k2);
494 PRINT_NONZERO_COEFFICIENT(brown_intrinsics, k3);
495 PRINT_NONZERO_COEFFICIENT(brown_intrinsics, k4);
496 PRINT_NONZERO_COEFFICIENT(brown_intrinsics, p1);
497 PRINT_NONZERO_COEFFICIENT(brown_intrinsics, p2);
498 break;
499 }
500 default: LOG(FATAL) << "Unknown distortion model.";
501 }
502
503#undef PRINT_NONZERO_COEFFICIENT
504
505 return os;
506}
507
508} // namespace libmv
void ApplyIntrinsics(double normalized_x, double normalized_y, double *image_x, double *image_y) const override
virtual void Unpack(const PackedIntrinsics &packed_intrinsics) override
virtual void Pack(PackedIntrinsics *packed_intrinsics) const override
void SetRadialDistortion(double k1, double k2, double k3, double k4)
void InvertIntrinsics(double image_x, double image_y, double *normalized_x, double *normalized_y) const override
void SetFocalLength(double focal_x, double focal_y)
void NormalizedToImageSpace(double normalized_x, double normalized_y, double *image_x, double *image_y) const
virtual void Unpack(const PackedIntrinsics &packed_intrinsics)
virtual void Pack(PackedIntrinsics *packed_intrinsics) const
virtual DistortionModelType GetDistortionModelType() const =0
void ImageSpaceToNormalized(double image_x, double image_y, double *normalized_x, double *normalized_y) const
virtual void Unpack(const PackedIntrinsics &packed_intrinsics) override
virtual void Pack(PackedIntrinsics *packed_intrinsics) const override
void InvertIntrinsics(double image_x, double image_y, double *normalized_x, double *normalized_y) const override
void ApplyIntrinsics(double normalized_x, double normalized_y, double *image_x, double *image_y) const override
virtual void Pack(PackedIntrinsics *packed_intrinsics) const override
void InvertIntrinsics(double image_x, double image_y, double *normalized_x, double *normalized_y) const override
virtual void Unpack(const PackedIntrinsics &packed_intrinsics) override
void ApplyIntrinsics(double normalized_x, double normalized_y, double *image_x, double *image_y) const override
double GetPrincipalPointY() const
void SetFocalLength(double focal_length)
double GetPrincipalPointX() const
void SetPrincipalPoint(double x, double y)
virtual void Pack(PackedIntrinsics *packed_intrinsics) const override
void InvertIntrinsics(double image_x, double image_y, double *normalized_x, double *normalized_y) const override
virtual void Unpack(const PackedIntrinsics &packed_intrinsics) override
void SetRadialDistortion(double k1, double k2, double k3)
void ApplyIntrinsics(double normalized_x, double normalized_y, double *image_x, double *image_y) const override
#define PRINT_NONZERO_COEFFICIENT(intrinsics, coeff)
#define LOG(level)
Definition log.h:97
void InvertNukeDistortionModel(const T &focal_length_x, const T &focal_length_y, const T &principal_point_x, const T &principal_point_y, const int image_width, const int image_height, const T &k1, const T &k2, const T &image_x, const T &image_y, T *normalized_x, T *normalized_y)
std::ostream & operator<<(std::ostream &os, const CameraIntrinsics &intrinsics)
A human-readable representation of the camera intrinsic parameters.
void InvertPolynomialDistortionModel(const double focal_length_x, const double focal_length_y, const double principal_point_x, const double principal_point_y, const double k1, const double k2, const double k3, const double p1, const double p2, const double image_x, const double image_y, double *normalized_x, double *normalized_y)
void ApplyPolynomialDistortionModel(const T &focal_length_x, const T &focal_length_y, const T &principal_point_x, const T &principal_point_y, const T &k1, const T &k2, const T &k3, const T &p1, const T &p2, const T &normalized_x, const T &normalized_y, T *image_x, T *image_y)
Eigen::Matrix< double, 3, 3 > Mat3
Definition numeric.h:75
void ApplyDivisionDistortionModel(const T &focal_length_x, const T &focal_length_y, const T &principal_point_x, const T &principal_point_y, const T &k1, const T &k2, const T &normalized_x, const T &normalized_y, T *image_x, T *image_y)
void ApplyNukeDistortionModel(const double focal_length_x, const double focal_length_y, const double principal_point_x, const double principal_point_y, const int image_width, const int image_height, const double k1, const double k2, const double normalized_x, const double normalized_y, double *image_x, double *image_y)
void InvertBrownDistortionModel(const double focal_length_x, const double focal_length_y, const double principal_point_x, const double principal_point_y, const double k1, const double k2, const double k3, const double k4, const double p1, const double p2, const double image_x, const double image_y, double *normalized_x, double *normalized_y)
void InvertDivisionDistortionModel(const double focal_length_x, const double focal_length_y, const double principal_point_x, const double principal_point_y, const double k1, const double k2, const double image_x, const double image_y, double *normalized_x, double *normalized_y)
@ DISTORTION_MODEL_POLYNOMIAL
@ DISTORTION_MODEL_DIVISION
@ DISTORTION_MODEL_BROWN
@ DISTORTION_MODEL_NUKE
void ApplyBrownDistortionModel(const T &focal_length_x, const T &focal_length_y, const T &principal_point_x, const T &principal_point_y, const T &k1, const T &k2, const T &k3, const T &k4, const T &p1, const T &p2, const T &normalized_x, const T &normalized_y, T *image_x, T *image_y)