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
00026 #ifdef __cplusplus
00027 extern "C" {
00029 # define C_TYPEDEF(t,c)
00030 #else
00031 # define C_TYPEDEF(t,c) typedef t c c;
00032 #endif
00033
00039
00040
00047 #ifdef CONF_SYMBOL_VISIBILITY
00048 # if defined CONF_COMPILER_gcc
00049 # define LF_EXPORT __attribute__((visibility("default")))
00050 # elif defined CONF_COMPILER_msvc
00051 # define LF_EXPORT __declspec(dllexport)
00052 # else
00053 # error "I don't know how to change symbol visibility for your compiler"
00054 # endif
00055 #else
00056 # if defined CONF_COMPILER_msvc
00057 # define LF_EXPORT __declspec(dllimport)
00058 # else
00060 # define LF_EXPORT
00061 # endif
00062 #endif
00063
00065 #define cbool int
00066
00075 typedef char *lfMLstr;
00076
00078 enum lfError
00079 {
00081 LF_NO_ERROR = 0,
00083 LF_WRONG_FORMAT
00084 };
00085
00086 C_TYPEDEF (enum, lfError)
00087
00088
00096 LF_EXPORT void lf_free (void *data);
00097
00104 LF_EXPORT const char *lf_mlstr_get (const lfMLstr str);
00105
00121 LF_EXPORT lfMLstr lf_mlstr_add (lfMLstr str, const char *lang, const char *trstr);
00122
00130 LF_EXPORT lfMLstr lf_mlstr_dup (const lfMLstr str);
00131
00134
00135
00151 struct LF_EXPORT lfMount
00152 {
00154 lfMLstr Name;
00156 char **Compat;
00157
00158 #ifdef __cplusplus
00159
00162 lfMount ();
00163
00167 lfMount &operator = (const lfMount &other);
00168
00172 ~lfMount ();
00173
00182 void SetName (const char *val, const char *lang = NULL);
00183
00189 void AddCompat (const char *val);
00190
00196 bool Check ();
00197 #endif
00198 };
00199
00200 C_TYPEDEF (struct, lfMount)
00201
00202
00209 LF_EXPORT lfMount *lf_mount_new ();
00210
00219 LF_EXPORT void lf_mount_destroy (lfMount *mount);
00220
00230 LF_EXPORT void lf_mount_copy (lfMount *dest, const lfMount *source);
00231
00233 LF_EXPORT cbool lf_mount_check (lfMount *mount);
00234
00237
00238
00257 struct LF_EXPORT lfCamera
00258 {
00260 lfMLstr Maker;
00262 lfMLstr Model;
00264 lfMLstr Variant;
00266 char *Mount;
00268 float CropFactor;
00270 int Score;
00271
00272 #ifdef __cplusplus
00273
00276 lfCamera ();
00277
00281 lfCamera (const lfCamera &other);
00282
00286 ~lfCamera ();
00287
00291 lfCamera &operator = (const lfCamera &other);
00292
00301 void SetMaker (const char *val, const char *lang = NULL);
00302
00311 void SetModel (const char *val, const char *lang = NULL);
00312
00321 void SetVariant (const char *val, const char *lang = NULL);
00322
00328 void SetMount (const char *val);
00329
00335 bool Check ();
00336 #endif
00337 };
00338
00339 C_TYPEDEF (struct, lfCamera)
00340
00341
00348 LF_EXPORT lfCamera *lf_camera_new ();
00349
00358 LF_EXPORT void lf_camera_destroy (lfCamera *camera);
00359
00369 LF_EXPORT void lf_camera_copy (lfCamera *dest, const lfCamera *source);
00370
00372 LF_EXPORT cbool lf_camera_check (lfCamera *camera);
00373
00376
00377
00393 enum lfDistortionModel
00394 {
00396 LF_DIST_MODEL_NONE,
00402 LF_DIST_MODEL_POLY3,
00407 LF_DIST_MODEL_POLY5,
00413 LF_DIST_MODEL_FOV1,
00418 LF_DIST_MODEL_PTLENS,
00419 };
00420
00421 C_TYPEDEF (enum, lfDistortionModel)
00422
00423
00428 struct lfLensCalibDistortion
00429 {
00431 enum lfDistortionModel Model;
00433 float Focal;
00435 float Terms [3];
00436 };
00437
00438 C_TYPEDEF (struct, lfLensCalibDistortion)
00439
00440
00449 enum lfTCAModel
00450 {
00452 LF_TCA_MODEL_NONE,
00458 LF_TCA_MODEL_LINEAR
00459 };
00460
00461 C_TYPEDEF (enum, lfTCAModel)
00462
00463
00469 struct lfLensCalibTCA
00470 {
00472 enum lfTCAModel Model;
00474 float Focal;
00476 float Terms [2];
00477 };
00478
00479 C_TYPEDEF (struct, lfLensCalibTCA)
00480
00481
00492 enum lfVignettingModel
00493 {
00495 LF_VIGNETTING_MODEL_NONE,
00502 LF_VIGNETTING_MODEL_PA
00503 };
00504
00505 C_TYPEDEF (enum, lfVignettingModel)
00506
00507
00514 struct lfLensCalibVignetting
00515 {
00517 enum lfVignettingModel Model;
00519 float Focal;
00521 float Aperture;
00523 float Distance;
00525 float Terms [3];
00526 };
00527
00528 C_TYPEDEF (struct, lfLensCalibVignetting)
00529
00530
00533 struct lfParameter
00534 {
00536 const char *Name;
00538 float Min;
00540 float Max;
00542 float Default;
00543 };
00544
00545 C_TYPEDEF (struct, lfParameter)
00546
00547
00550 enum lfLensType
00551 {
00553 LF_UNKNOWN,
00555 LF_RECTILINEAR,
00560 LF_FISHEYE,
00562 LF_PANORAMIC,
00567 LF_EQUIRECTANGULAR
00568 };
00569
00570 C_TYPEDEF (enum, lfLensType)
00571
00572
00582 struct LF_EXPORT lfLens
00583 {
00585 lfMLstr Maker;
00587 lfMLstr Model;
00589 float MinFocal;
00591 float MaxFocal;
00593 float MinAperture;
00595 float MaxAperture;
00597 char **Mounts;
00607 float CenterX;
00609 float CenterY;
00611 float RedCCI;
00613 float GreenCCI;
00615 float BlueCCI;
00617 float CropFactor;
00619 lfLensType Type;
00621 lfLensCalibDistortion **CalibDistortion;
00623 lfLensCalibTCA **CalibTCA;
00625 lfLensCalibVignetting **CalibVignetting;
00627 int Score;
00628
00629 #ifdef __cplusplus
00630
00633 lfLens ();
00634
00638 lfLens (const lfLens &other);
00639
00643 ~lfLens ();
00644
00648 lfLens &operator = (const lfLens &other);
00649
00658 void SetMaker (const char *val, const char *lang = NULL);
00659
00668 void SetModel (const char *val, const char *lang = NULL);
00669
00676 void AddMount (const char *val);
00677
00685 void AddCalibDistortion (const lfLensCalibDistortion *dc);
00686
00692 bool RemoveCalibDistortion (int idx);
00693
00701 void AddCalibTCA (const lfLensCalibTCA *tcac);
00702
00708 bool RemoveCalibTCA (int idx);
00709
00717 void AddCalibVignetting (const lfLensCalibVignetting *vc);
00718
00724 bool RemoveCalibVignetting (int idx);
00725
00733 void GuessParameters ();
00734
00740 bool Check ();
00741
00757 static const char *GetDistortionModelDesc (
00758 lfDistortionModel model, const char **details, const lfParameter ***params);
00774 static const char *GetTCAModelDesc (
00775 lfTCAModel model, const char **details, const lfParameter ***params);
00776
00792 static const char *GetVignettingModelDesc (
00793 lfVignettingModel model, const char **details, const lfParameter ***params);
00794
00806 static const char *GetLensTypeDesc (lfLensType type, const char **details);
00807
00815 bool InterpolateDistortion (float focal, lfLensCalibDistortion &res) const;
00816
00824 bool InterpolateTCA (float focal, lfLensCalibTCA &res) const;
00825
00838 bool InterpolateVignetting (
00839 float focal, float aperture, float distance, lfLensCalibVignetting &res) const;
00840 #endif
00841 };
00842
00843 C_TYPEDEF (struct, lfLens)
00844
00845
00852 LF_EXPORT lfLens *lf_lens_new ();
00853
00862 LF_EXPORT void lf_lens_destroy (lfLens *lens);
00863
00873 LF_EXPORT void lf_lens_copy (lfLens *dest, const lfLens *source);
00874
00876 LF_EXPORT cbool lf_lens_check (lfLens *lens);
00877
00879 LF_EXPORT void lf_lens_guess_parameters (lfLens *lens);
00880
00882 LF_EXPORT const char *lf_get_distortion_model_desc (
00883 enum lfDistortionModel model, const char **details, const lfParameter ***params);
00884
00886 LF_EXPORT const char *lf_get_tca_model_desc (
00887 enum lfTCAModel model, const char **details, const lfParameter ***params);
00888
00890 LF_EXPORT const char *lf_get_vignetting_model_desc (
00891 enum lfVignettingModel model, const char **details, const lfParameter ***params);
00892
00894 LF_EXPORT const char *lf_get_lens_type_desc (
00895 enum lfLensType type, const char **details);
00896
00898 LF_EXPORT cbool lf_lens_interpolate_distortion (const lfLens *lens, float focal,
00899 lfLensCalibDistortion *res);
00900
00902 LF_EXPORT cbool lf_lens_interpolate_tca (const lfLens *lens, float focal, lfLensCalibTCA *res);
00903
00905 LF_EXPORT cbool lf_lens_interpolate_vignetting (const lfLens *lens, float focal, float aperture,
00906 float distance, lfLensCalibVignetting *res);
00907
00909 LF_EXPORT void lf_lens_add_calib_distortion (lfLens *lens, const lfLensCalibDistortion *dc);
00910
00912 LF_EXPORT cbool lf_lens_remove_calib_distortion (lfLens *lens, int idx);
00913
00915 LF_EXPORT void lf_lens_add_calib_tca (lfLens *lens, const lfLensCalibTCA *tcac);
00916
00918 LF_EXPORT cbool lf_lens_remove_calib_tca (lfLens *lens, int idx);
00919
00921 LF_EXPORT void lf_lens_add_calib_vignetting (lfLens *lens, const lfLensCalibVignetting *vc);
00922
00924 LF_EXPORT cbool lf_lens_remove_calib_vignetting (lfLens *lens, int idx);
00925
00928
00929
00958 struct LF_EXPORT lfDatabase
00959 {
00961 char *HomeDataDir;
00962
00963 #ifdef __cplusplus
00964
00967 static lfDatabase *Create ();
00968
00972 void Destroy ();
00973
00982 lfError Load ();
00983
00995 lfError Load (const char *filename);
00996
01010 lfError Load (const char *errcontext, const char *data, size_t data_size);
01011
01019 lfError Save (const char *filename) const;
01020
01034 lfError Save (const char *filename,
01035 const lfMount *const *mounts,
01036 const lfCamera *const *cameras,
01037 const lfLens *const *lenses) const;
01038
01051 static char *Save (const lfMount *const *mounts,
01052 const lfCamera *const *cameras,
01053 const lfLens *const *lenses);
01054
01078 const lfCamera **FindCameras (const char *maker, const char *model) const;
01079
01096 const lfCamera **FindCamerasExt (const char *maker, const char *model) const;
01097
01105 const lfCamera *const *GetCameras () const;
01106
01140 const lfLens **FindLenses (
01141 const lfCamera *camera, const char *maker, const char *model) const;
01142
01157 const lfLens **FindLenses (const lfLens *lens) const;
01158
01166 const lfLens *const *GetLenses () const;
01167
01175 const lfMount *FindMount (const char *mount) const;
01176
01184 const char *MountName (const char *mount) const;
01185
01193 const lfMount *const *GetMounts () const;
01194
01195 protected:
01196
01197 lfDatabase () {}
01198 ~lfDatabase () {}
01199 #endif
01200 };
01201
01202 C_TYPEDEF (struct, lfDatabase)
01203
01204
01213 LF_EXPORT lfDatabase *lf_db_new (void);
01214
01223 LF_EXPORT void lf_db_destroy (lfDatabase *db);
01224
01226 LF_EXPORT lfError lf_db_load (lfDatabase *db);
01227
01229 LF_EXPORT lfError lf_db_load_file (lfDatabase *db, const char *filename);
01230
01232 LF_EXPORT lfError lf_db_load_data (lfDatabase *db, const char *errcontext,
01233 const char *data, size_t data_size);
01234
01236 LF_EXPORT lfError lf_db_save_all (const lfDatabase *db, const char *filename);
01237
01239 LF_EXPORT lfError lf_db_save_file (const lfDatabase *db, const char *filename,
01240 const lfMount *const *mounts,
01241 const lfCamera *const *cameras,
01242 const lfLens *const *lenses);
01243
01245 LF_EXPORT char *lf_db_save (const lfMount *const *mounts,
01246 const lfCamera *const *cameras,
01247 const lfLens *const *lenses);
01248
01250 LF_EXPORT const lfCamera **lf_db_find_cameras (const lfDatabase *db,
01251 const char *maker, const char *model);
01252
01254 LF_EXPORT const lfCamera **lf_db_find_cameras_ext (
01255 const lfDatabase *db, const char *maker, const char *model);
01256
01258 LF_EXPORT const lfCamera *const *lf_db_get_cameras (const lfDatabase *db);
01259
01261 LF_EXPORT const lfLens **lf_db_find_lenses_hd (const lfDatabase *db,
01262 const lfCamera *camera,
01263 const char *maker,
01264 const char *lens);
01265
01267 LF_EXPORT const lfLens **lf_db_find_lenses (const lfDatabase *db,
01268 const lfLens *lens);
01269
01271 LF_EXPORT const lfLens *const *lf_db_get_lenses (const lfDatabase *db);
01272
01274 LF_EXPORT const lfMount *lf_db_find_mount (const lfDatabase *db, const char *mount);
01275
01277 LF_EXPORT const char *lf_db_mount_name (const lfDatabase *db, const char *mount);
01278
01280 LF_EXPORT const lfMount *const *lf_db_get_mounts (const lfDatabase *db);
01281
01284
01285
01294 enum
01295 {
01297 LF_MODIFY_TCA = 0x00000001,
01299 LF_MODIFY_VIGNETTING = 0x00000002,
01301 LF_MODIFY_CCI = 0x00000004,
01303 LF_MODIFY_DISTORTION = 0x00000008,
01305 LF_MODIFY_GEOMETRY = 0x00000010,
01307 LF_MODIFY_SCALE = 0x00000020,
01309 LF_MODIFY_ALL = ~0
01310 };
01311
01313 enum lfPixelFormat
01314 {
01316 LF_PF_U8,
01318 LF_PF_U16,
01320 LF_PF_U32,
01322 LF_PF_F32,
01324 LF_PF_F64
01325 };
01326
01327 C_TYPEDEF (enum, lfPixelFormat)
01328
01329
01330 enum lfComponentRole
01331 {
01336 LF_CR_END = 0,
01343 LF_CR_NEXT,
01345 LF_CR_UNKNOWN,
01347 LF_CR_INTENSITY,
01349 LF_CR_RED,
01351 LF_CR_GREEN,
01353 LF_CR_BLUE
01354 };
01355
01356 C_TYPEDEF (enum, lfComponentRole)
01357
01358
01359 #define LF_CR_1(a) (LF_CR_ ## a)
01360
01361 #define LF_CR_2(a,b) ((LF_CR_ ## a) | ((LF_CR_ ## b) << 4))
01362
01363 #define LF_CR_3(a,b,c) ((LF_CR_ ## a) | ((LF_CR_ ## b) << 4) | \
01364 ((LF_CR_ ## c) << 8))
01365
01366 #define LF_CR_4(a,b,c,d) ((LF_CR_ ## a) | ((LF_CR_ ## b) << 4) | \
01367 ((LF_CR_ ## c) << 8) | ((LF_CR_ ## d) << 12))
01368
01369 #define LF_CR_5(a,b,c,d,e) ((LF_CR_ ## a) | ((LF_CR_ ## b) << 4) | \
01370 ((LF_CR_ ## c) << 8) | ((LF_CR_ ## d) << 12) | \
01371 ((LF_CR_ ## e) << 16))
01372
01373 #define LF_CR_6(a,b,c,d,e,f) ((LF_CR_ ## a) | ((LF_CR_ ## b) << 4) | \
01374 ((LF_CR_ ## c) << 8) | ((LF_CR_ ## d) << 12) | \
01375 ((LF_CR_ ## e) << 16) | ((LF_CR_ ## e) << 20))
01376
01391 typedef void (*lfSubpixelCoordFunc) (void *data, float *iocoord, int count);
01392
01416 typedef void (*lfModifyColorFunc) (void *data, float x, float y,
01417 void *pixels, int comp_role, int count);
01418
01430 typedef void (*lfModifyCoordFunc) (void *data, float *iocoord, int count);
01431
01491 struct LF_EXPORT lfModifier
01492 {
01493 #ifdef __cplusplus
01494
01514 static lfModifier *Create (const lfLens *lens, float crop, int width, int height);
01515
01556 int Initialize (
01557 const lfLens *lens, lfPixelFormat format, float focal, float aperture,
01558 float distance, float scale, lfLensType targeom, int flags, bool reverse);
01559
01564 void Destroy ();
01565
01582 void AddCoordCallback (lfModifyCoordFunc callback, int priority,
01583 void *data, size_t data_size);
01584
01602 void AddSubpixelCallback (lfSubpixelCoordFunc callback, int priority,
01603 void *data, size_t data_size);
01604
01621 void AddColorCallback (lfModifyColorFunc callback, int priority,
01622 void *data, size_t data_size);
01623
01637 bool AddSubpixelCallbackTCA (lfLensCalibTCA &model, bool reverse = false);
01638
01653 bool AddColorCallbackVignetting (lfLensCalibVignetting &model, lfPixelFormat format,
01654 bool reverse = false);
01655
01670 bool AddColorCallbackCCI (const lfLens *lens, lfPixelFormat format,
01671 bool reverse = false);
01672
01685 bool AddCoordCallbackDistortion (lfLensCalibDistortion &model, bool reverse = false);
01686
01699 bool AddCoordCallbackGeometry (lfLensType from, lfLensType to, float focal);
01700
01716 bool AddCoordCallbackScale (float scale, bool reverse = false);
01717
01730 float GetAutoScale (bool reverse);
01731
01760 bool ApplySubpixelDistortion (float xu, float yu, int width, int height,
01761 float *res) const;
01762
01791 bool ApplyColorModification (void *pixels, float x, float y, int width, int height,
01792 int comp_role, int row_stride) const;
01793
01820 bool ApplyGeometryDistortion (float xu, float yu, int width, int height,
01821 float *res) const;
01822
01850 bool ApplySubpixelGeometryDistortion (float xu, float yu, int width, int height,
01851 float *res) const;
01852
01853 protected:
01854
01855 lfModifier () {}
01856 ~lfModifier () {}
01857 #endif
01858 };
01859
01860 C_TYPEDEF (struct, lfModifier)
01861
01862
01863 LF_EXPORT lfModifier *lf_modifier_new (
01864 const lfLens *lens, float crop, int width, int height);
01865
01867 LF_EXPORT void lf_modifier_destroy (lfModifier *modifier);
01868
01870 LF_EXPORT int lf_modifier_initialize (
01871 lfModifier *modifier, const lfLens *lens, lfPixelFormat format,
01872 float focal, float aperture, float distance, float scale,
01873 lfLensType targeom, int flags, cbool reverse);
01874
01876 LF_EXPORT void lf_modifier_add_coord_callback (
01877 lfModifier *modifier, lfModifyCoordFunc callback, int priority,
01878 void *data, size_t data_size);
01879
01881 LF_EXPORT void lf_modifier_add_subpixel_callback (
01882 lfModifier *modifier, lfSubpixelCoordFunc callback, int priority,
01883 void *data, size_t data_size);
01884
01886 LF_EXPORT void lf_modifier_add_color_callback (
01887 lfModifier *modifier, lfModifyColorFunc callback, int priority,
01888 void *data, size_t data_size);
01889
01891 LF_EXPORT cbool lf_modifier_add_subpixel_callback_TCA (
01892 lfModifier *modifier, lfLensCalibTCA *model, cbool reverse);
01893
01895 LF_EXPORT cbool lf_modifier_add_color_callback_vignetting (
01896 lfModifier *modifier, lfLensCalibVignetting *model,
01897 lfPixelFormat format, cbool reverse);
01898
01900 LF_EXPORT cbool lf_modifier_add_color_callback_CCI (
01901 lfModifier *modifier, const lfLens *lens,
01902 lfPixelFormat format, cbool reverse);
01903
01905 LF_EXPORT cbool lf_modifier_add_coord_callback_distortion (
01906 lfModifier *modifier, lfLensCalibDistortion *model, cbool reverse);
01907
01909 LF_EXPORT cbool lf_modifier_add_coord_callback_geometry (
01910 lfModifier *modifier, lfLensType from, lfLensType to, float focal);
01911
01913 LF_EXPORT cbool lf_modifier_add_coord_callback_scale (
01914 lfModifier *modifier, float scale, cbool reverse);
01915
01917 LF_EXPORT float lf_modifier_get_auto_scale (
01918 lfModifier *modifier, cbool reverse);
01919
01921 LF_EXPORT cbool lf_modifier_apply_subpixel_distortion (
01922 lfModifier *modifier, float xu, float yu, int width, int height, float *res);
01923
01925 LF_EXPORT cbool lf_modifier_apply_color_modification (
01926 lfModifier *modifier, void *pixels, float x, float y, int width, int height,
01927 int comp_role, int row_stride);
01928
01930 LF_EXPORT cbool lf_modifier_apply_geometry_distortion (
01931 lfModifier *modifier, float xu, float yu, int width, int height, float *res);
01932
01934 LF_EXPORT cbool lf_modifier_apply_subpixel_geometry_distortion (
01935 lfModifier *modifier, float xu, float yu, int width, int height, float *res);
01936
01939 #undef cbool
01940
01941 #ifdef __cplusplus
01942 }
01943 #endif
01944
01945 #endif