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
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Brightness Control the brightness and contrast of the input color Vector Map input vector components with curves Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert Invert a producing a negative Combine Generate a color from its and blue channels(Deprecated)") DefNode(ShaderNode
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)
struct libmv_CameraIntrinsics libmv_CameraIntrinsics
@ LIBMV_DISTORTION_MODEL_POLYNOMIAL
@ LIBMV_DISTORTION_MODEL_NUKE
@ LIBMV_DISTORTION_MODEL_BROWN
@ LIBMV_DISTORTION_MODEL_DIVISION
@ 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