00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __LENSFUN_H__
00022 #define __LENSFUN_H__
00023
00024 #include <stddef.h>
00025 #include <limits.h>
00026
00027 #ifdef __cplusplus
00028 extern "C" {
00030 # define C_TYPEDEF(t,c)
00031 #else
00032 # define C_TYPEDEF(t,c) typedef t c c;
00033 #endif
00034
00040
00041
00048 #ifdef CONF_SYMBOL_VISIBILITY
00049 # if defined CONF_COMPILER_gcc
00050 # define LF_EXPORT __attribute__((visibility("default")))
00051 # elif defined CONF_COMPILER_msvc
00052 # define LF_EXPORT __declspec(dllexport)
00053 # else
00054 # error "I don't know how to change symbol visibility for your compiler"
00055 # endif
00056 #else
00057 # if defined CONF_COMPILER_msvc
00058 # define LF_EXPORT __declspec(dllimport)
00059 # else
00061 # define LF_EXPORT
00062 # endif
00063 #endif
00064
00066 #define cbool int
00067
00076 typedef char *lfMLstr;
00077
00079 enum lfError
00080 {
00082 LF_NO_ERROR = 0,
00084 LF_WRONG_FORMAT
00085 };
00086
00087 C_TYPEDEF (enum, lfError)
00088
00089
00097 LF_EXPORT void lf_free (void *data);
00098
00105 LF_EXPORT const char *lf_mlstr_get (const lfMLstr str);
00106
00122 LF_EXPORT lfMLstr lf_mlstr_add (lfMLstr str, const char *lang, const char *trstr);
00123
00131 LF_EXPORT lfMLstr lf_mlstr_dup (const lfMLstr str);
00132
00135
00136
00152 struct LF_EXPORT lfMount
00153 {
00155 lfMLstr Name;
00157 char **Compat;
00158
00159 #ifdef __cplusplus
00160
00163 lfMount ();
00164
00168 lfMount &operator = (const lfMount &other);
00169
00173 ~lfMount ();
00174
00183 void SetName (const char *val, const char *lang = NULL);
00184
00190 void AddCompat (const char *val);
00191
00197 bool Check ();
00198 #endif
00199 };
00200
00201 C_TYPEDEF (struct, lfMount)
00202
00203
00210 LF_EXPORT lfMount *lf_mount_new ();
00211
00220 LF_EXPORT void lf_mount_destroy (lfMount *mount);
00221
00231 LF_EXPORT void lf_mount_copy (lfMount *dest, const lfMount *source);
00232
00234 LF_EXPORT cbool lf_mount_check (lfMount *mount);
00235
00238
00239
00258 struct LF_EXPORT lfCamera
00259 {
00261 lfMLstr Maker;
00263 lfMLstr Model;
00265 lfMLstr Variant;
00267 char *Mount;
00269 float CropFactor;
00271 int Score;
00272
00273 #ifdef __cplusplus
00274
00277 lfCamera ();
00278
00282 lfCamera (const lfCamera &other);
00283
00287 ~lfCamera ();
00288
00292 lfCamera &operator = (const lfCamera &other);
00293
00302 void SetMaker (const char *val, const char *lang = NULL);
00303
00312 void SetModel (const char *val, const char *lang = NULL);
00313
00322 void SetVariant (const char *val, const char *lang = NULL);
00323
00329 void SetMount (const char *val);
00330
00336 bool Check ();
00337 #endif
00338 };
00339
00340 C_TYPEDEF (struct, lfCamera)
00341
00342
00349 LF_EXPORT lfCamera *lf_camera_new ();
00350
00359 LF_EXPORT void lf_camera_destroy (lfCamera *camera);
00360
00370 LF_EXPORT void lf_camera_copy (lfCamera *dest, const lfCamera *source);
00371
00373 LF_EXPORT cbool lf_camera_check (lfCamera *camera);
00374
00377
00378
00394 enum lfDistortionModel
00395 {
00397 LF_DIST_MODEL_NONE,
00403 LF_DIST_MODEL_POLY3,
00408 LF_DIST_MODEL_POLY5,
00414 LF_DIST_MODEL_FOV1,
00419 LF_DIST_MODEL_PTLENS,
00421 LF_DIST_MODEL_SENTINEL = INT_MAX
00422 };
00423
00424 C_TYPEDEF (enum, lfDistortionModel)
00425
00426
00431 struct lfLensCalibDistortion
00432 {
00434 enum lfDistortionModel Model;
00436 float Focal;
00438 float Terms [3];
00439 };
00440
00441 C_TYPEDEF (struct, lfLensCalibDistortion)
00442
00443
00452 enum lfTCAModel
00453 {
00455 LF_TCA_MODEL_NONE,
00461 LF_TCA_MODEL_LINEAR,
00463 LF_TCA_MODEL_SENTINEL = INT_MAX
00464 };
00465
00466 C_TYPEDEF (enum, lfTCAModel)
00467
00468
00474 struct lfLensCalibTCA
00475 {
00477 enum lfTCAModel Model;
00479 float Focal;
00481 float Terms [2];
00482 };
00483
00484 C_TYPEDEF (struct, lfLensCalibTCA)
00485
00486
00497 enum lfVignettingModel
00498 {
00500 LF_VIGNETTING_MODEL_NONE,
00507 LF_VIGNETTING_MODEL_PA,
00508
00510 LF_VIGNETTING_MODEL_SENTINEL = INT_MAX
00511 };
00512
00513 C_TYPEDEF (enum, lfVignettingModel)
00514
00515
00522 struct lfLensCalibVignetting
00523 {
00525 enum lfVignettingModel Model;
00527 float Focal;
00529 float Aperture;
00531 float Distance;
00533 float Terms [3];
00534 };
00535
00536 C_TYPEDEF (struct, lfLensCalibVignetting)
00537
00538
00541 struct lfParameter
00542 {
00544 const char *Name;
00546 float Min;
00548 float Max;
00550 float Default;
00551 };
00552
00553 C_TYPEDEF (struct, lfParameter)
00554
00555
00558 enum lfLensType
00559 {
00561 LF_UNKNOWN,
00563 LF_RECTILINEAR,
00568 LF_FISHEYE,
00570 LF_PANORAMIC,
00575 LF_EQUIRECTANGULAR,
00577 LF_SENTINEL = INT_MAX
00578 };
00579
00580 C_TYPEDEF (enum, lfLensType)
00581
00582
00592 struct LF_EXPORT lfLens
00593 {
00595 lfMLstr Maker;
00597 lfMLstr Model;
00599 float MinFocal;
00601 float MaxFocal;
00603 float MinAperture;
00605 float MaxAperture;
00607 char **Mounts;
00617 float CenterX;
00619 float CenterY;
00621 float RedCCI;
00623 float GreenCCI;
00625 float BlueCCI;
00627 float CropFactor;
00629 lfLensType Type;
00631 lfLensCalibDistortion **CalibDistortion;
00633 lfLensCalibTCA **CalibTCA;
00635 lfLensCalibVignetting **CalibVignetting;
00637 int Score;
00638
00639 #ifdef __cplusplus
00640
00643 lfLens ();
00644
00648 lfLens (const lfLens &other);
00649
00653 ~lfLens ();
00654
00658 lfLens &operator = (const lfLens &other);
00659
00668 void SetMaker (const char *val, const char *lang = NULL);
00669
00678 void SetModel (const char *val, const char *lang = NULL);
00679
00686 void AddMount (const char *val);
00687
00695 void AddCalibDistortion (const lfLensCalibDistortion *dc);
00696
00702 bool RemoveCalibDistortion (int idx);
00703
00711 void AddCalibTCA (const lfLensCalibTCA *tcac);
00712
00718 bool RemoveCalibTCA (int idx);
00719
00727 void AddCalibVignetting (const lfLensCalibVignetting *vc);
00728
00734 bool RemoveCalibVignetting (int idx);
00735
00743 void GuessParameters ();
00744
00750 bool Check ();
00751
00767 static const char *GetDistortionModelDesc (
00768 lfDistortionModel model, const char **details, const lfParameter ***params);
00784 static const char *GetTCAModelDesc (
00785 lfTCAModel model, const char **details, const lfParameter ***params);
00786
00802 static const char *GetVignettingModelDesc (
00803 lfVignettingModel model, const char **details, const lfParameter ***params);
00804
00816 static const char *GetLensTypeDesc (lfLensType type, const char **details);
00817
00825 bool InterpolateDistortion (float focal, lfLensCalibDistortion &res) const;
00826
00834 bool InterpolateTCA (float focal, lfLensCalibTCA &res) const;
00835
00848 bool InterpolateVignetting (
00849 float focal, float aperture, float distance, lfLensCalibVignetting &res) const;
00850 #endif
00851 };
00852
00853 C_TYPEDEF (struct, lfLens)
00854
00855
00862 LF_EXPORT lfLens *lf_lens_new ();
00863
00872 LF_EXPORT void lf_lens_destroy (lfLens *lens);
00873
00883 LF_EXPORT void lf_lens_copy (lfLens *dest, const lfLens *source);
00884
00886 LF_EXPORT cbool lf_lens_check (lfLens *lens);
00887
00889 LF_EXPORT void lf_lens_guess_parameters (lfLens *lens);
00890
00892 LF_EXPORT const char *lf_get_distortion_model_desc (
00893 enum lfDistortionModel model, const char **details, const lfParameter ***params);
00894
00896 LF_EXPORT const char *lf_get_tca_model_desc (
00897 enum lfTCAModel model, const char **details, const lfParameter ***params);
00898
00900 LF_EXPORT const char *lf_get_vignetting_model_desc (
00901 enum lfVignettingModel model, const char **details, const lfParameter ***params);
00902
00904 LF_EXPORT const char *lf_get_lens_type_desc (
00905 enum lfLensType type, const char **details);
00906
00908 LF_EXPORT cbool lf_lens_interpolate_distortion (const lfLens *lens, float focal,
00909 lfLensCalibDistortion *res);
00910
00912 LF_EXPORT cbool lf_lens_interpolate_tca (const lfLens *lens, float focal, lfLensCalibTCA *res);
00913
00915 LF_EXPORT cbool lf_lens_interpolate_vignetting (const lfLens *lens, float focal, float aperture,
00916 float distance, lfLensCalibVignetting *res);
00917
00919 LF_EXPORT void lf_lens_add_calib_distortion (lfLens *lens, const lfLensCalibDistortion *dc);
00920
00922 LF_EXPORT cbool lf_lens_remove_calib_distortion (lfLens *lens, int idx);
00923
00925 LF_EXPORT void lf_lens_add_calib_tca (lfLens *lens, const lfLensCalibTCA *tcac);
00926
00928 LF_EXPORT cbool lf_lens_remove_calib_tca (lfLens *lens, int idx);
00929
00931 LF_EXPORT void lf_lens_add_calib_vignetting (lfLens *lens, const lfLensCalibVignetting *vc);
00932
00934 LF_EXPORT cbool lf_lens_remove_calib_vignetting (lfLens *lens, int idx);
00935
00938
00939
00949 enum
00950 {
00956 LF_SEARCH_LOOSE = 1
00957 };
00958
00981 struct LF_EXPORT lfDatabase
00982 {
00984 char *HomeDataDir;
00985
00986 #ifdef __cplusplus
00987
00990 static lfDatabase *Create ();
00991
00995 void Destroy ();
00996
01005 lfError Load ();
01006
01018 lfError Load (const char *filename);
01019
01033 lfError Load (const char *errcontext, const char *data, size_t data_size);
01034
01042 lfError Save (const char *filename) const;
01043
01057 lfError Save (const char *filename,
01058 const lfMount *const *mounts,
01059 const lfCamera *const *cameras,
01060 const lfLens *const *lenses) const;
01061
01074 static char *Save (const lfMount *const *mounts,
01075 const lfCamera *const *cameras,
01076 const lfLens *const *lenses);
01077
01101 const lfCamera **FindCameras (const char *maker, const char *model) const;
01102
01122 const lfCamera **FindCamerasExt (const char *maker, const char *model,
01123 int sflags = 0) const;
01124
01132 const lfCamera *const *GetCameras () const;
01133
01170 const lfLens **FindLenses (const lfCamera *camera, const char *maker,
01171 const char *model, int sflags = 0) const;
01172
01190 const lfLens **FindLenses (const lfLens *lens, int sflags = 0) const;
01191
01199 const lfLens *const *GetLenses () const;
01200
01208 const lfMount *FindMount (const char *mount) const;
01209
01217 const char *MountName (const char *mount) const;
01218
01226 const lfMount *const *GetMounts () const;
01227
01228 protected:
01229
01230 lfDatabase () {}
01231 ~lfDatabase () {}
01232 #endif
01233 };
01234
01235 C_TYPEDEF (struct, lfDatabase)
01236
01237
01246 LF_EXPORT lfDatabase *lf_db_new (void);
01247
01256 LF_EXPORT void lf_db_destroy (lfDatabase *db);
01257
01259 LF_EXPORT lfError lf_db_load (lfDatabase *db);
01260
01262 LF_EXPORT lfError lf_db_load_file (lfDatabase *db, const char *filename);
01263
01265 LF_EXPORT lfError lf_db_load_data (lfDatabase *db, const char *errcontext,
01266 const char *data, size_t data_size);
01267
01269 LF_EXPORT lfError lf_db_save_all (const lfDatabase *db, const char *filename);
01270
01272 LF_EXPORT lfError lf_db_save_file (const lfDatabase *db, const char *filename,
01273 const lfMount *const *mounts,
01274 const lfCamera *const *cameras,
01275 const lfLens *const *lenses);
01276
01278 LF_EXPORT char *lf_db_save (const lfMount *const *mounts,
01279 const lfCamera *const *cameras,
01280 const lfLens *const *lenses);
01281
01283 LF_EXPORT const lfCamera **lf_db_find_cameras (
01284 const lfDatabase *db, const char *maker, const char *model);
01285
01287 LF_EXPORT const lfCamera **lf_db_find_cameras_ext (
01288 const lfDatabase *db, const char *maker, const char *model, int sflags);
01289
01291 LF_EXPORT const lfCamera *const *lf_db_get_cameras (const lfDatabase *db);
01292
01294 LF_EXPORT const lfLens **lf_db_find_lenses_hd (
01295 const lfDatabase *db, const lfCamera *camera, const char *maker,
01296 const char *lens, int sflags);
01297
01299 LF_EXPORT const lfLens **lf_db_find_lenses (
01300 const lfDatabase *db, const lfLens *lens, int sflags);
01301
01303 LF_EXPORT const lfLens *const *lf_db_get_lenses (const lfDatabase *db);
01304
01306 LF_EXPORT const lfMount *lf_db_find_mount (const lfDatabase *db, const char *mount);
01307
01309 LF_EXPORT const char *lf_db_mount_name (const lfDatabase *db, const char *mount);
01310
01312 LF_EXPORT const lfMount *const *lf_db_get_mounts (const lfDatabase *db);
01313
01316
01317
01326 enum
01327 {
01329 LF_MODIFY_TCA = 0x00000001,
01331 LF_MODIFY_VIGNETTING = 0x00000002,
01333 LF_MODIFY_CCI = 0x00000004,
01335 LF_MODIFY_DISTORTION = 0x00000008,
01337 LF_MODIFY_GEOMETRY = 0x00000010,
01339 LF_MODIFY_SCALE = 0x00000020,
01341 LF_MODIFY_ALL = ~0
01342 };
01343
01345 enum lfPixelFormat
01346 {
01348 LF_PF_U8,
01350 LF_PF_U16,
01352 LF_PF_U32,
01354 LF_PF_F32,
01356 LF_PF_F64
01357 };
01358
01359 C_TYPEDEF (enum, lfPixelFormat)
01360
01361
01362 enum lfComponentRole
01363 {
01368 LF_CR_END = 0,
01375 LF_CR_NEXT,
01377 LF_CR_UNKNOWN,
01379 LF_CR_INTENSITY,
01381 LF_CR_RED,
01383 LF_CR_GREEN,
01385 LF_CR_BLUE
01386 };
01387
01388 C_TYPEDEF (enum, lfComponentRole)
01389
01390
01391 #define LF_CR_1(a) (LF_CR_ ## a)
01392
01393 #define LF_CR_2(a,b) ((LF_CR_ ## a) | ((LF_CR_ ## b) << 4))
01394
01395 #define LF_CR_3(a,b,c) ((LF_CR_ ## a) | ((LF_CR_ ## b) << 4) | \
01396 ((LF_CR_ ## c) << 8))
01397
01398 #define LF_CR_4(a,b,c,d) ((LF_CR_ ## a) | ((LF_CR_ ## b) << 4) | \
01399 ((LF_CR_ ## c) << 8) | ((LF_CR_ ## d) << 12))
01400
01401 #define LF_CR_5(a,b,c,d,e) ((LF_CR_ ## a) | ((LF_CR_ ## b) << 4) | \
01402 ((LF_CR_ ## c) << 8) | ((LF_CR_ ## d) << 12) | \
01403 ((LF_CR_ ## e) << 16))
01404
01405 #define LF_CR_6(a,b,c,d,e,f) ((LF_CR_ ## a) | ((LF_CR_ ## b) << 4) | \
01406 ((LF_CR_ ## c) << 8) | ((LF_CR_ ## d) << 12) | \
01407 ((LF_CR_ ## e) << 16) | ((LF_CR_ ## f) << 20))
01408
01409 #define LF_CR_7(a,b,c,d,e,f,g) ((LF_CR_ ## a) | ((LF_CR_ ## b) << 4) | \
01410 ((LF_CR_ ## c) << 8) | ((LF_CR_ ## d) << 12) | \
01411 ((LF_CR_ ## e) << 16) | ((LF_CR_ ## f) << 20) | \
01412 ((LF_CR_ ## g) << 24))
01413
01414 #define LF_CR_8(a,b,c,d,e,f,g,h) ((LF_CR_ ## a) | ((LF_CR_ ## b) << 4) | \
01415 ((LF_CR_ ## c) << 8) | ((LF_CR_ ## d) << 12) | \
01416 ((LF_CR_ ## e) << 16) | ((LF_CR_ ## f) << 20) | \
01417 ((LF_CR_ ## g) << 24) | ((LF_CR_ ## h) << 28))
01418
01433 typedef void (*lfSubpixelCoordFunc) (void *data, float *iocoord, int count);
01434
01458 typedef void (*lfModifyColorFunc) (void *data, float x, float y,
01459 void *pixels, int comp_role, int count);
01460
01472 typedef void (*lfModifyCoordFunc) (void *data, float *iocoord, int count);
01473
01533 struct LF_EXPORT lfModifier
01534 {
01535 #ifdef __cplusplus
01536
01556 static lfModifier *Create (const lfLens *lens, float crop, int width, int height);
01557
01598 int Initialize (
01599 const lfLens *lens, lfPixelFormat format, float focal, float aperture,
01600 float distance, float scale, lfLensType targeom, int flags, bool reverse);
01601
01606 void Destroy ();
01607
01624 void AddCoordCallback (lfModifyCoordFunc callback, int priority,
01625 void *data, size_t data_size);
01626
01644 void AddSubpixelCallback (lfSubpixelCoordFunc callback, int priority,
01645 void *data, size_t data_size);
01646
01663 void AddColorCallback (lfModifyColorFunc callback, int priority,
01664 void *data, size_t data_size);
01665
01679 bool AddSubpixelCallbackTCA (lfLensCalibTCA &model, bool reverse = false);
01680
01695 bool AddColorCallbackVignetting (lfLensCalibVignetting &model, lfPixelFormat format,
01696 bool reverse = false);
01697
01712 bool AddColorCallbackCCI (const lfLens *lens, lfPixelFormat format,
01713 bool reverse = false);
01714
01727 bool AddCoordCallbackDistortion (lfLensCalibDistortion &model, bool reverse = false);
01728
01741 bool AddCoordCallbackGeometry (lfLensType from, lfLensType to, float focal);
01742
01758 bool AddCoordCallbackScale (float scale, bool reverse = false);
01759
01772 float GetAutoScale (bool reverse);
01773
01802 bool ApplySubpixelDistortion (float xu, float yu, int width, int height,
01803 float *res) const;
01804
01833 bool ApplyColorModification (void *pixels, float x, float y, int width, int height,
01834 int comp_role, int row_stride) const;
01835
01862 bool ApplyGeometryDistortion (float xu, float yu, int width, int height,
01863 float *res) const;
01864
01892 bool ApplySubpixelGeometryDistortion (float xu, float yu, int width, int height,
01893 float *res) const;
01894
01895 protected:
01896
01897 lfModifier () {}
01898 ~lfModifier () {}
01899 #endif
01900 };
01901
01902 C_TYPEDEF (struct, lfModifier)
01903
01904
01905 LF_EXPORT lfModifier *lf_modifier_new (
01906 const lfLens *lens, float crop, int width, int height);
01907
01909 LF_EXPORT void lf_modifier_destroy (lfModifier *modifier);
01910
01912 LF_EXPORT int lf_modifier_initialize (
01913 lfModifier *modifier, const lfLens *lens, lfPixelFormat format,
01914 float focal, float aperture, float distance, float scale,
01915 lfLensType targeom, int flags, cbool reverse);
01916
01918 LF_EXPORT void lf_modifier_add_coord_callback (
01919 lfModifier *modifier, lfModifyCoordFunc callback, int priority,
01920 void *data, size_t data_size);
01921
01923 LF_EXPORT void lf_modifier_add_subpixel_callback (
01924 lfModifier *modifier, lfSubpixelCoordFunc callback, int priority,
01925 void *data, size_t data_size);
01926
01928 LF_EXPORT void lf_modifier_add_color_callback (
01929 lfModifier *modifier, lfModifyColorFunc callback, int priority,
01930 void *data, size_t data_size);
01931
01933 LF_EXPORT cbool lf_modifier_add_subpixel_callback_TCA (
01934 lfModifier *modifier, lfLensCalibTCA *model, cbool reverse);
01935
01937 LF_EXPORT cbool lf_modifier_add_color_callback_vignetting (
01938 lfModifier *modifier, lfLensCalibVignetting *model,
01939 lfPixelFormat format, cbool reverse);
01940
01942 LF_EXPORT cbool lf_modifier_add_color_callback_CCI (
01943 lfModifier *modifier, const lfLens *lens,
01944 lfPixelFormat format, cbool reverse);
01945
01947 LF_EXPORT cbool lf_modifier_add_coord_callback_distortion (
01948 lfModifier *modifier, lfLensCalibDistortion *model, cbool reverse);
01949
01951 LF_EXPORT cbool lf_modifier_add_coord_callback_geometry (
01952 lfModifier *modifier, lfLensType from, lfLensType to, float focal);
01953
01955 LF_EXPORT cbool lf_modifier_add_coord_callback_scale (
01956 lfModifier *modifier, float scale, cbool reverse);
01957
01959 LF_EXPORT float lf_modifier_get_auto_scale (
01960 lfModifier *modifier, cbool reverse);
01961
01963 LF_EXPORT cbool lf_modifier_apply_subpixel_distortion (
01964 lfModifier *modifier, float xu, float yu, int width, int height, float *res);
01965
01967 LF_EXPORT cbool lf_modifier_apply_color_modification (
01968 lfModifier *modifier, void *pixels, float x, float y, int width, int height,
01969 int comp_role, int row_stride);
01970
01972 LF_EXPORT cbool lf_modifier_apply_geometry_distortion (
01973 lfModifier *modifier, float xu, float yu, int width, int height, float *res);
01974
01976 LF_EXPORT cbool lf_modifier_apply_subpixel_geometry_distortion (
01977 lfModifier *modifier, float xu, float yu, int width, int height, float *res);
01978
01981 #undef cbool
01982
01983 #ifdef __cplusplus
01984 }
01985 #endif
01986
01987 #endif