Blender V4.3
intern/camera_intrinsics.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
14
16 const libmv_CameraIntrinsicsOptions* libmv_camera_intrinsics_options) {
17 CameraIntrinsics* camera_intrinsics =
18 libmv_cameraIntrinsicsCreateFromOptions(libmv_camera_intrinsics_options);
19 return (libmv_CameraIntrinsics*)camera_intrinsics;
20}
21
23 const libmv_CameraIntrinsics* libmv_intrinsics) {
24 const CameraIntrinsics* orig_intrinsics =
25 (const CameraIntrinsics*)libmv_intrinsics;
26
27 CameraIntrinsics* new_intrinsics = NULL;
28 switch (orig_intrinsics->GetDistortionModelType()) {
30 const PolynomialCameraIntrinsics* polynomial_intrinsics =
31 static_cast<const PolynomialCameraIntrinsics*>(orig_intrinsics);
32 new_intrinsics =
33 LIBMV_OBJECT_NEW(PolynomialCameraIntrinsics, *polynomial_intrinsics);
34 break;
35 }
37 const DivisionCameraIntrinsics* division_intrinsics =
38 static_cast<const DivisionCameraIntrinsics*>(orig_intrinsics);
39 new_intrinsics =
40 LIBMV_OBJECT_NEW(DivisionCameraIntrinsics, *division_intrinsics);
41 break;
42 }
44 const NukeCameraIntrinsics* nuke_intrinsics =
45 static_cast<const NukeCameraIntrinsics*>(orig_intrinsics);
46 new_intrinsics = LIBMV_OBJECT_NEW(NukeCameraIntrinsics, *nuke_intrinsics);
47 break;
48 }
50 const BrownCameraIntrinsics* brown_intrinsics =
51 static_cast<const BrownCameraIntrinsics*>(orig_intrinsics);
52 new_intrinsics =
53 LIBMV_OBJECT_NEW(BrownCameraIntrinsics, *brown_intrinsics);
54 break;
55 }
56 default: assert(!"Unknown distortion model");
57 }
58 return (libmv_CameraIntrinsics*)new_intrinsics;
59}
60
64
66 const libmv_CameraIntrinsicsOptions* libmv_camera_intrinsics_options,
67 libmv_CameraIntrinsics* libmv_intrinsics) {
68 CameraIntrinsics* camera_intrinsics = (CameraIntrinsics*)libmv_intrinsics;
69
70 double focal_length = libmv_camera_intrinsics_options->focal_length;
71 double principal_x = libmv_camera_intrinsics_options->principal_point_x;
72 double principal_y = libmv_camera_intrinsics_options->principal_point_y;
73 int image_width = libmv_camera_intrinsics_options->image_width;
74 int image_height = libmv_camera_intrinsics_options->image_height;
75
76 /* Try avoid unnecessary updates, so pre-computed distortion grids
77 * are not freed.
78 */
79
80 camera_intrinsics->SetThreads(libmv_camera_intrinsics_options->num_threads);
81
82 if (camera_intrinsics->focal_length() != focal_length) {
83 camera_intrinsics->SetFocalLength(focal_length, focal_length);
84 }
85
86 if (camera_intrinsics->principal_point_x() != principal_x ||
87 camera_intrinsics->principal_point_y() != principal_y) {
88 camera_intrinsics->SetPrincipalPoint(principal_x, principal_y);
89 }
90
91 if (camera_intrinsics->image_width() != image_width ||
92 camera_intrinsics->image_height() != image_height) {
93 camera_intrinsics->SetImageSize(image_width, image_height);
94 }
95
96 switch (libmv_camera_intrinsics_options->distortion_model) {
98 assert(camera_intrinsics->GetDistortionModelType() ==
100
101 PolynomialCameraIntrinsics* polynomial_intrinsics =
102 (PolynomialCameraIntrinsics*)camera_intrinsics;
103
104 double k1 = libmv_camera_intrinsics_options->polynomial_k1;
105 double k2 = libmv_camera_intrinsics_options->polynomial_k2;
106 double k3 = libmv_camera_intrinsics_options->polynomial_k3;
107
108 if (polynomial_intrinsics->k1() != k1 ||
109 polynomial_intrinsics->k2() != k2 ||
110 polynomial_intrinsics->k3() != k3) {
111 polynomial_intrinsics->SetRadialDistortion(k1, k2, k3);
112 }
113 break;
114 }
115
117 assert(camera_intrinsics->GetDistortionModelType() ==
119
120 DivisionCameraIntrinsics* division_intrinsics =
121 (DivisionCameraIntrinsics*)camera_intrinsics;
122
123 double k1 = libmv_camera_intrinsics_options->division_k1;
124 double k2 = libmv_camera_intrinsics_options->division_k2;
125
126 if (division_intrinsics->k1() != k1 || division_intrinsics->k2() != k2) {
127 division_intrinsics->SetDistortion(k1, k2);
128 }
129
130 break;
131 }
132
134 assert(camera_intrinsics->GetDistortionModelType() ==
136
137 NukeCameraIntrinsics* nuke_intrinsics =
138 (NukeCameraIntrinsics*)camera_intrinsics;
139
140 double k1 = libmv_camera_intrinsics_options->nuke_k1;
141 double k2 = libmv_camera_intrinsics_options->nuke_k2;
142
143 if (nuke_intrinsics->k1() != k1 || nuke_intrinsics->k2() != k2) {
144 nuke_intrinsics->SetDistortion(k1, k2);
145 }
146
147 break;
148 }
149
151 assert(camera_intrinsics->GetDistortionModelType() ==
153
154 BrownCameraIntrinsics* brown_intrinsics =
155 (BrownCameraIntrinsics*)camera_intrinsics;
156
157 double k1 = libmv_camera_intrinsics_options->brown_k1;
158 double k2 = libmv_camera_intrinsics_options->brown_k2;
159 double k3 = libmv_camera_intrinsics_options->brown_k3;
160 double k4 = libmv_camera_intrinsics_options->brown_k4;
161
162 if (brown_intrinsics->k1() != k1 || brown_intrinsics->k2() != k2 ||
163 brown_intrinsics->k3() != k3 || brown_intrinsics->k4() != k4) {
164 brown_intrinsics->SetRadialDistortion(k1, k2, k3, k4);
165 }
166
167 double p1 = libmv_camera_intrinsics_options->brown_p1;
168 double p2 = libmv_camera_intrinsics_options->brown_p2;
169
170 if (brown_intrinsics->p1() != p1 || brown_intrinsics->p2() != p2) {
171 brown_intrinsics->SetTangentialDistortion(p1, p2);
172 }
173 break;
174 }
175
176 default: assert(!"Unknown distortion model");
177 }
178}
179
181 int threads) {
182 CameraIntrinsics* camera_intrinsics = (CameraIntrinsics*)libmv_intrinsics;
183 camera_intrinsics->SetThreads(threads);
184}
185
187 const libmv_CameraIntrinsics* libmv_intrinsics,
188 libmv_CameraIntrinsicsOptions* camera_intrinsics_options) {
189 const CameraIntrinsics* camera_intrinsics =
190 (const CameraIntrinsics*)libmv_intrinsics;
191
192 // Fill in options which are common for all distortion models.
193 camera_intrinsics_options->focal_length = camera_intrinsics->focal_length();
194 camera_intrinsics_options->principal_point_x =
195 camera_intrinsics->principal_point_x();
196 camera_intrinsics_options->principal_point_y =
197 camera_intrinsics->principal_point_y();
198
199 camera_intrinsics_options->image_width = camera_intrinsics->image_width();
200 camera_intrinsics_options->image_height = camera_intrinsics->image_height();
201
202 switch (camera_intrinsics->GetDistortionModelType()) {
204 const PolynomialCameraIntrinsics* polynomial_intrinsics =
205 static_cast<const PolynomialCameraIntrinsics*>(camera_intrinsics);
206 camera_intrinsics_options->distortion_model =
208 camera_intrinsics_options->polynomial_k1 = polynomial_intrinsics->k1();
209 camera_intrinsics_options->polynomial_k2 = polynomial_intrinsics->k2();
210 camera_intrinsics_options->polynomial_k3 = polynomial_intrinsics->k3();
211 camera_intrinsics_options->polynomial_p1 = polynomial_intrinsics->p1();
212 camera_intrinsics_options->polynomial_p2 = polynomial_intrinsics->p2();
213 break;
214 }
215
217 const DivisionCameraIntrinsics* division_intrinsics =
218 static_cast<const DivisionCameraIntrinsics*>(camera_intrinsics);
219 camera_intrinsics_options->distortion_model =
221 camera_intrinsics_options->division_k1 = division_intrinsics->k1();
222 camera_intrinsics_options->division_k2 = division_intrinsics->k2();
223 break;
224 }
225
227 const NukeCameraIntrinsics* nuke_intrinsics =
228 static_cast<const NukeCameraIntrinsics*>(camera_intrinsics);
229 camera_intrinsics_options->distortion_model = LIBMV_DISTORTION_MODEL_NUKE;
230 camera_intrinsics_options->nuke_k1 = nuke_intrinsics->k1();
231 camera_intrinsics_options->nuke_k2 = nuke_intrinsics->k2();
232 break;
233 }
234
236 const BrownCameraIntrinsics* brown_intrinsics =
237 static_cast<const BrownCameraIntrinsics*>(camera_intrinsics);
238 camera_intrinsics_options->distortion_model =
240 camera_intrinsics_options->brown_k1 = brown_intrinsics->k1();
241 camera_intrinsics_options->brown_k2 = brown_intrinsics->k2();
242 camera_intrinsics_options->brown_k3 = brown_intrinsics->k3();
243 camera_intrinsics_options->brown_k4 = brown_intrinsics->k4();
244 camera_intrinsics_options->brown_p1 = brown_intrinsics->p1();
245 camera_intrinsics_options->brown_p2 = brown_intrinsics->p2();
246 break;
247 }
248
249 default: assert(!"Unknown distortion model");
250 }
251}
252
254 const libmv_CameraIntrinsics* libmv_intrinsics,
255 const unsigned char* source_image,
256 int width,
257 int height,
258 float overscan,
259 int channels,
260 unsigned char* destination_image) {
261 CameraIntrinsics* camera_intrinsics = (CameraIntrinsics*)libmv_intrinsics;
262 camera_intrinsics->UndistortBuffer(
263 source_image, width, height, overscan, channels, destination_image);
264}
265
267 const libmv_CameraIntrinsics* libmv_intrinsics,
268 const float* source_image,
269 int width,
270 int height,
271 float overscan,
272 int channels,
273 float* destination_image) {
274 CameraIntrinsics* intrinsics = (CameraIntrinsics*)libmv_intrinsics;
275 intrinsics->UndistortBuffer(
276 source_image, width, height, overscan, channels, destination_image);
277}
278
280 const struct libmv_CameraIntrinsics* libmv_intrinsics,
281 const unsigned char* source_image,
282 int width,
283 int height,
284 float overscan,
285 int channels,
286 unsigned char* destination_image) {
287 CameraIntrinsics* intrinsics = (CameraIntrinsics*)libmv_intrinsics;
288 intrinsics->DistortBuffer(
289 source_image, width, height, overscan, channels, destination_image);
290}
291
293 const libmv_CameraIntrinsics* libmv_intrinsics,
294 float* source_image,
295 int width,
296 int height,
297 float overscan,
298 int channels,
299 float* destination_image) {
300 CameraIntrinsics* intrinsics = (CameraIntrinsics*)libmv_intrinsics;
301 intrinsics->DistortBuffer(
302 source_image, width, height, overscan, channels, destination_image);
303}
304
306 const struct libmv_CameraIntrinsics* libmv_intrinsics,
307 double x,
308 double y,
309 double* x1,
310 double* y1) {
311 CameraIntrinsics* intrinsics = (CameraIntrinsics*)libmv_intrinsics;
312 intrinsics->ApplyIntrinsics(x, y, x1, y1);
313}
314
316 const struct libmv_CameraIntrinsics* libmv_intrinsics,
317 double x,
318 double y,
319 double* x1,
320 double* y1) {
321 CameraIntrinsics* intrinsics = (CameraIntrinsics*)libmv_intrinsics;
322 intrinsics->InvertIntrinsics(x, y, x1, y1);
323}
324
326 const libmv_CameraIntrinsicsOptions* camera_intrinsics_options,
327 CameraIntrinsics* camera_intrinsics) {
328 camera_intrinsics->SetFocalLength(camera_intrinsics_options->focal_length,
329 camera_intrinsics_options->focal_length);
330
331 camera_intrinsics->SetPrincipalPoint(
332 camera_intrinsics_options->principal_point_x,
333 camera_intrinsics_options->principal_point_y);
334
335 camera_intrinsics->SetImageSize(camera_intrinsics_options->image_width,
336 camera_intrinsics_options->image_height);
337
338 switch (camera_intrinsics_options->distortion_model) {
340 PolynomialCameraIntrinsics* polynomial_intrinsics =
341 static_cast<PolynomialCameraIntrinsics*>(camera_intrinsics);
342
343 polynomial_intrinsics->SetRadialDistortion(
344 camera_intrinsics_options->polynomial_k1,
345 camera_intrinsics_options->polynomial_k2,
346 camera_intrinsics_options->polynomial_k3);
347
348 break;
349 }
350
352 DivisionCameraIntrinsics* division_intrinsics =
353 static_cast<DivisionCameraIntrinsics*>(camera_intrinsics);
354
355 division_intrinsics->SetDistortion(
356 camera_intrinsics_options->division_k1,
357 camera_intrinsics_options->division_k2);
358 break;
359 }
360
362 NukeCameraIntrinsics* nuke_intrinsics =
363 static_cast<NukeCameraIntrinsics*>(camera_intrinsics);
364
365 nuke_intrinsics->SetDistortion(camera_intrinsics_options->nuke_k1,
366 camera_intrinsics_options->nuke_k2);
367 break;
368 }
369
371 BrownCameraIntrinsics* brown_intrinsics =
372 static_cast<BrownCameraIntrinsics*>(camera_intrinsics);
373
374 brown_intrinsics->SetRadialDistortion(
375 camera_intrinsics_options->brown_k1,
376 camera_intrinsics_options->brown_k2,
377 camera_intrinsics_options->brown_k3,
378 camera_intrinsics_options->brown_k4);
379 brown_intrinsics->SetTangentialDistortion(
380 camera_intrinsics_options->brown_p1,
381 camera_intrinsics_options->brown_p2);
382
383 break;
384 }
385
386 default: assert(!"Unknown distortion model");
387 }
388}
389
391 const libmv_CameraIntrinsicsOptions* camera_intrinsics_options) {
392 CameraIntrinsics* camera_intrinsics = NULL;
393 switch (camera_intrinsics_options->distortion_model) {
395 camera_intrinsics = LIBMV_OBJECT_NEW(PolynomialCameraIntrinsics);
396 break;
398 camera_intrinsics = LIBMV_OBJECT_NEW(DivisionCameraIntrinsics);
399 break;
401 camera_intrinsics = LIBMV_OBJECT_NEW(NukeCameraIntrinsics);
402 break;
404 camera_intrinsics = LIBMV_OBJECT_NEW(BrownCameraIntrinsics);
405 break;
406 default: assert(!"Unknown distortion model");
407 }
408 libmv_cameraIntrinsicsFillFromOptions(camera_intrinsics_options,
409 camera_intrinsics);
410 return camera_intrinsics;
411}
static constexpr int image_width
static constexpr int image_height
void SetRadialDistortion(double k1, double k2, double k3, double k4)
virtual void ApplyIntrinsics(double normalized_x, double normalized_y, double *image_x, double *image_y) const =0
void DistortBuffer(const PixelType *input_buffer, int width, int height, double overscan, int channels, PixelType *output_buffer)
void SetFocalLength(double focal_x, double focal_y)
virtual void InvertIntrinsics(double image_x, double image_y, double *normalized_x, double *normalized_y) const =0
void UndistortBuffer(const PixelType *input_buffer, int width, int height, double overscan, int channels, PixelType *output_buffer)
virtual DistortionModelType GetDistortionModelType() const =0
void SetRadialDistortion(double k1, double k2, double k3)
#define NULL
void libmv_cameraIntrinsicsUndistortFloat(const libmv_CameraIntrinsics *libmv_intrinsics, const float *source_image, int width, int height, float overscan, int channels, float *destination_image)
void libmv_cameraIntrinsicsDestroy(libmv_CameraIntrinsics *libmv_intrinsics)
libmv_CameraIntrinsics * libmv_cameraIntrinsicsCopy(const libmv_CameraIntrinsics *libmv_intrinsics)
CameraIntrinsics * libmv_cameraIntrinsicsCreateFromOptions(const libmv_CameraIntrinsicsOptions *camera_intrinsics_options)
void libmv_cameraIntrinsicsUndistortByte(const libmv_CameraIntrinsics *libmv_intrinsics, const unsigned char *source_image, int width, int height, float overscan, int channels, unsigned char *destination_image)
void libmv_cameraIntrinsicsDistortByte(const struct libmv_CameraIntrinsics *libmv_intrinsics, const unsigned char *source_image, int width, int height, float overscan, int channels, unsigned char *destination_image)
void libmv_cameraIntrinsicsApply(const struct libmv_CameraIntrinsics *libmv_intrinsics, double x, double y, double *x1, double *y1)
void libmv_cameraIntrinsicsDistortFloat(const libmv_CameraIntrinsics *libmv_intrinsics, float *source_image, int width, int height, float overscan, int channels, float *destination_image)
static void libmv_cameraIntrinsicsFillFromOptions(const libmv_CameraIntrinsicsOptions *camera_intrinsics_options, CameraIntrinsics *camera_intrinsics)
void libmv_cameraIntrinsicsSetThreads(libmv_CameraIntrinsics *libmv_intrinsics, int threads)
void libmv_cameraIntrinsicsUpdate(const libmv_CameraIntrinsicsOptions *libmv_camera_intrinsics_options, libmv_CameraIntrinsics *libmv_intrinsics)
void libmv_cameraIntrinsicsInvert(const struct libmv_CameraIntrinsics *libmv_intrinsics, double x, double y, double *x1, double *y1)
void libmv_cameraIntrinsicsExtractOptions(const libmv_CameraIntrinsics *libmv_intrinsics, libmv_CameraIntrinsicsOptions *camera_intrinsics_options)
libmv_CameraIntrinsics * libmv_cameraIntrinsicsNew(const libmv_CameraIntrinsicsOptions *libmv_camera_intrinsics_options)
@ LIBMV_DISTORTION_MODEL_POLYNOMIAL
@ LIBMV_DISTORTION_MODEL_NUKE
@ LIBMV_DISTORTION_MODEL_BROWN
@ LIBMV_DISTORTION_MODEL_DIVISION
struct libmv_CameraIntrinsics libmv_CameraIntrinsics
@ DISTORTION_MODEL_POLYNOMIAL
@ DISTORTION_MODEL_DIVISION
@ DISTORTION_MODEL_BROWN
@ DISTORTION_MODEL_NUKE
#define LIBMV_OBJECT_NEW(type,...)
Definition utildefines.h:39
#define LIBMV_OBJECT_DELETE(what, type)
Definition utildefines.h:42