Blender V5.0
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 if (camera_intrinsics->focal_length() != focal_length) {
80 camera_intrinsics->SetFocalLength(focal_length, focal_length);
81 }
82
83 if (camera_intrinsics->principal_point_x() != principal_x ||
84 camera_intrinsics->principal_point_y() != principal_y) {
85 camera_intrinsics->SetPrincipalPoint(principal_x, principal_y);
86 }
87
88 if (camera_intrinsics->image_width() != image_width ||
89 camera_intrinsics->image_height() != image_height) {
90 camera_intrinsics->SetImageSize(image_width, image_height);
91 }
92
93 switch (libmv_camera_intrinsics_options->distortion_model) {
95 assert(camera_intrinsics->GetDistortionModelType() ==
97
98 PolynomialCameraIntrinsics* polynomial_intrinsics =
99 (PolynomialCameraIntrinsics*)camera_intrinsics;
100
101 double k1 = libmv_camera_intrinsics_options->polynomial_k1;
102 double k2 = libmv_camera_intrinsics_options->polynomial_k2;
103 double k3 = libmv_camera_intrinsics_options->polynomial_k3;
104
105 if (polynomial_intrinsics->k1() != k1 ||
106 polynomial_intrinsics->k2() != k2 ||
107 polynomial_intrinsics->k3() != k3) {
108 polynomial_intrinsics->SetRadialDistortion(k1, k2, k3);
109 }
110 break;
111 }
112
114 assert(camera_intrinsics->GetDistortionModelType() ==
116
117 DivisionCameraIntrinsics* division_intrinsics =
118 (DivisionCameraIntrinsics*)camera_intrinsics;
119
120 double k1 = libmv_camera_intrinsics_options->division_k1;
121 double k2 = libmv_camera_intrinsics_options->division_k2;
122
123 if (division_intrinsics->k1() != k1 || division_intrinsics->k2() != k2) {
124 division_intrinsics->SetDistortion(k1, k2);
125 }
126
127 break;
128 }
129
131 assert(camera_intrinsics->GetDistortionModelType() ==
133
134 NukeCameraIntrinsics* nuke_intrinsics =
135 (NukeCameraIntrinsics*)camera_intrinsics;
136
137 double k1 = libmv_camera_intrinsics_options->nuke_k1;
138 double k2 = libmv_camera_intrinsics_options->nuke_k2;
139
140 if (nuke_intrinsics->k1() != k1 || nuke_intrinsics->k2() != k2) {
141 nuke_intrinsics->SetDistortion(k1, k2);
142 }
143
144 break;
145 }
146
148 assert(camera_intrinsics->GetDistortionModelType() ==
150
151 BrownCameraIntrinsics* brown_intrinsics =
152 (BrownCameraIntrinsics*)camera_intrinsics;
153
154 double k1 = libmv_camera_intrinsics_options->brown_k1;
155 double k2 = libmv_camera_intrinsics_options->brown_k2;
156 double k3 = libmv_camera_intrinsics_options->brown_k3;
157 double k4 = libmv_camera_intrinsics_options->brown_k4;
158
159 if (brown_intrinsics->k1() != k1 || brown_intrinsics->k2() != k2 ||
160 brown_intrinsics->k3() != k3 || brown_intrinsics->k4() != k4) {
161 brown_intrinsics->SetRadialDistortion(k1, k2, k3, k4);
162 }
163
164 double p1 = libmv_camera_intrinsics_options->brown_p1;
165 double p2 = libmv_camera_intrinsics_options->brown_p2;
166
167 if (brown_intrinsics->p1() != p1 || brown_intrinsics->p2() != p2) {
168 brown_intrinsics->SetTangentialDistortion(p1, p2);
169 }
170 break;
171 }
172
173 default: assert(!"Unknown distortion model");
174 }
175}
176
178 const libmv_CameraIntrinsics* libmv_intrinsics,
179 libmv_CameraIntrinsicsOptions* camera_intrinsics_options) {
180 const CameraIntrinsics* camera_intrinsics =
181 (const CameraIntrinsics*)libmv_intrinsics;
182
183 // Fill in options which are common for all distortion models.
184 camera_intrinsics_options->focal_length = camera_intrinsics->focal_length();
185 camera_intrinsics_options->principal_point_x =
186 camera_intrinsics->principal_point_x();
187 camera_intrinsics_options->principal_point_y =
188 camera_intrinsics->principal_point_y();
189
190 camera_intrinsics_options->image_width = camera_intrinsics->image_width();
191 camera_intrinsics_options->image_height = camera_intrinsics->image_height();
192
193 switch (camera_intrinsics->GetDistortionModelType()) {
195 const PolynomialCameraIntrinsics* polynomial_intrinsics =
196 static_cast<const PolynomialCameraIntrinsics*>(camera_intrinsics);
197 camera_intrinsics_options->distortion_model =
199 camera_intrinsics_options->polynomial_k1 = polynomial_intrinsics->k1();
200 camera_intrinsics_options->polynomial_k2 = polynomial_intrinsics->k2();
201 camera_intrinsics_options->polynomial_k3 = polynomial_intrinsics->k3();
202 camera_intrinsics_options->polynomial_p1 = polynomial_intrinsics->p1();
203 camera_intrinsics_options->polynomial_p2 = polynomial_intrinsics->p2();
204 break;
205 }
206
208 const DivisionCameraIntrinsics* division_intrinsics =
209 static_cast<const DivisionCameraIntrinsics*>(camera_intrinsics);
210 camera_intrinsics_options->distortion_model =
212 camera_intrinsics_options->division_k1 = division_intrinsics->k1();
213 camera_intrinsics_options->division_k2 = division_intrinsics->k2();
214 break;
215 }
216
218 const NukeCameraIntrinsics* nuke_intrinsics =
219 static_cast<const NukeCameraIntrinsics*>(camera_intrinsics);
220 camera_intrinsics_options->distortion_model = LIBMV_DISTORTION_MODEL_NUKE;
221 camera_intrinsics_options->nuke_k1 = nuke_intrinsics->k1();
222 camera_intrinsics_options->nuke_k2 = nuke_intrinsics->k2();
223 break;
224 }
225
227 const BrownCameraIntrinsics* brown_intrinsics =
228 static_cast<const BrownCameraIntrinsics*>(camera_intrinsics);
229 camera_intrinsics_options->distortion_model =
231 camera_intrinsics_options->brown_k1 = brown_intrinsics->k1();
232 camera_intrinsics_options->brown_k2 = brown_intrinsics->k2();
233 camera_intrinsics_options->brown_k3 = brown_intrinsics->k3();
234 camera_intrinsics_options->brown_k4 = brown_intrinsics->k4();
235 camera_intrinsics_options->brown_p1 = brown_intrinsics->p1();
236 camera_intrinsics_options->brown_p2 = brown_intrinsics->p2();
237 break;
238 }
239
240 default: assert(!"Unknown distortion model");
241 }
242}
243
245 const libmv_CameraIntrinsics* libmv_intrinsics,
246 const unsigned char* source_image,
247 int width,
248 int height,
249 float overscan,
250 int channels,
251 unsigned char* destination_image) {
252 CameraIntrinsics* camera_intrinsics = (CameraIntrinsics*)libmv_intrinsics;
253 camera_intrinsics->UndistortBuffer(
254 source_image, width, height, overscan, channels, destination_image);
255}
256
258 const libmv_CameraIntrinsics* libmv_intrinsics,
259 const float* source_image,
260 int width,
261 int height,
262 float overscan,
263 int channels,
264 float* destination_image) {
265 CameraIntrinsics* intrinsics = (CameraIntrinsics*)libmv_intrinsics;
266 intrinsics->UndistortBuffer(
267 source_image, width, height, overscan, channels, destination_image);
268}
269
271 const struct libmv_CameraIntrinsics* libmv_intrinsics,
272 const unsigned char* source_image,
273 int width,
274 int height,
275 float overscan,
276 int channels,
277 unsigned char* destination_image) {
278 CameraIntrinsics* intrinsics = (CameraIntrinsics*)libmv_intrinsics;
279 intrinsics->DistortBuffer(
280 source_image, width, height, overscan, channels, destination_image);
281}
282
284 const libmv_CameraIntrinsics* libmv_intrinsics,
285 float* source_image,
286 int width,
287 int height,
288 float overscan,
289 int channels,
290 float* destination_image) {
291 CameraIntrinsics* intrinsics = (CameraIntrinsics*)libmv_intrinsics;
292 intrinsics->DistortBuffer(
293 source_image, width, height, overscan, channels, destination_image);
294}
295
297 const struct libmv_CameraIntrinsics* libmv_intrinsics,
298 double x,
299 double y,
300 double* x1,
301 double* y1) {
302 CameraIntrinsics* intrinsics = (CameraIntrinsics*)libmv_intrinsics;
303 intrinsics->ApplyIntrinsics(x, y, x1, y1);
304}
305
307 const struct libmv_CameraIntrinsics* libmv_intrinsics,
308 double x,
309 double y,
310 double* x1,
311 double* y1) {
312 CameraIntrinsics* intrinsics = (CameraIntrinsics*)libmv_intrinsics;
313 intrinsics->InvertIntrinsics(x, y, x1, y1);
314}
315
317 const libmv_CameraIntrinsicsOptions* camera_intrinsics_options,
318 CameraIntrinsics* camera_intrinsics) {
319 camera_intrinsics->SetFocalLength(camera_intrinsics_options->focal_length,
320 camera_intrinsics_options->focal_length);
321
322 camera_intrinsics->SetPrincipalPoint(
323 camera_intrinsics_options->principal_point_x,
324 camera_intrinsics_options->principal_point_y);
325
326 camera_intrinsics->SetImageSize(camera_intrinsics_options->image_width,
327 camera_intrinsics_options->image_height);
328
329 switch (camera_intrinsics_options->distortion_model) {
331 PolynomialCameraIntrinsics* polynomial_intrinsics =
332 static_cast<PolynomialCameraIntrinsics*>(camera_intrinsics);
333
334 polynomial_intrinsics->SetRadialDistortion(
335 camera_intrinsics_options->polynomial_k1,
336 camera_intrinsics_options->polynomial_k2,
337 camera_intrinsics_options->polynomial_k3);
338
339 break;
340 }
341
343 DivisionCameraIntrinsics* division_intrinsics =
344 static_cast<DivisionCameraIntrinsics*>(camera_intrinsics);
345
346 division_intrinsics->SetDistortion(
347 camera_intrinsics_options->division_k1,
348 camera_intrinsics_options->division_k2);
349 break;
350 }
351
353 NukeCameraIntrinsics* nuke_intrinsics =
354 static_cast<NukeCameraIntrinsics*>(camera_intrinsics);
355
356 nuke_intrinsics->SetDistortion(camera_intrinsics_options->nuke_k1,
357 camera_intrinsics_options->nuke_k2);
358 break;
359 }
360
362 BrownCameraIntrinsics* brown_intrinsics =
363 static_cast<BrownCameraIntrinsics*>(camera_intrinsics);
364
365 brown_intrinsics->SetRadialDistortion(
366 camera_intrinsics_options->brown_k1,
367 camera_intrinsics_options->brown_k2,
368 camera_intrinsics_options->brown_k3,
369 camera_intrinsics_options->brown_k4);
370 brown_intrinsics->SetTangentialDistortion(
371 camera_intrinsics_options->brown_p1,
372 camera_intrinsics_options->brown_p2);
373
374 break;
375 }
376
377 default: assert(!"Unknown distortion model");
378 }
379}
380
382 const libmv_CameraIntrinsicsOptions* camera_intrinsics_options) {
383 CameraIntrinsics* camera_intrinsics = NULL;
384 switch (camera_intrinsics_options->distortion_model) {
386 camera_intrinsics = LIBMV_OBJECT_NEW(PolynomialCameraIntrinsics);
387 break;
389 camera_intrinsics = LIBMV_OBJECT_NEW(DivisionCameraIntrinsics);
390 break;
392 camera_intrinsics = LIBMV_OBJECT_NEW(NukeCameraIntrinsics);
393 break;
395 camera_intrinsics = LIBMV_OBJECT_NEW(BrownCameraIntrinsics);
396 break;
397 default: assert(!"Unknown distortion model");
398 }
399 libmv_cameraIntrinsicsFillFromOptions(camera_intrinsics_options,
400 camera_intrinsics);
401 return camera_intrinsics;
402}
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 assert(assertion)
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_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:40
#define LIBMV_OBJECT_DELETE(what, type)
Definition utildefines.h:43