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
00059
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
00939 enum
00940 {
00946 LF_SEARCH_LOOSE = 1
00947 };
00948
00971 struct LF_EXPORT lfDatabase
00972 {
00974 char *HomeDataDir;
00975
00976 #ifdef __cplusplus
00977
00980 static lfDatabase *Create ();
00981
00985 void Destroy ();
00986
00995 lfError Load ();
00996
01008 lfError Load (const char *filename);
01009
01023 lfError Load (const char *errcontext, const char *data, size_t data_size);
01024
01032 lfError Save (const char *filename) const;
01033
01047 lfError Save (const char *filename,
01048 const lfMount *const *mounts,
01049 const lfCamera *const *cameras,
01050 const lfLens *const *lenses) const;
01051
01064 static char *Save (const lfMount *const *mounts,
01065 const lfCamera *const *cameras,
01066 const lfLens *const *lenses);
01067
01091 const lfCamera **FindCameras (const char *maker, const char *model) const;
01092
01112 const lfCamera **FindCamerasExt (const char *maker, const char *model,
01113 int sflags = 0) const;
01114
01122 const lfCamera *const *GetCameras () const;
01123
01160 const lfLens **FindLenses (const lfCamera *camera, const char *maker,
01161 const char *model, int sflags = 0) const;
01162
01180 const lfLens **FindLenses (const lfLens *lens, int sflags = 0) const;
01181
01189 const lfLens *const *GetLenses () const;
01190
01198 const lfMount *FindMount (const char *mount) const;
01199
01207 const char *MountName (const char *mount) const;
01208
01216 const lfMount *const *GetMounts () const;
01217
01218 protected:
01219
01220 lfDatabase () {}
01221 ~lfDatabase () {}
01222 #endif
01223 };
01224
01225 C_TYPEDEF (struct, lfDatabase)
01226
01227
01236 LF_EXPORT lfDatabase *lf_db_new (void);
01237
01246 LF_EXPORT void lf_db_destroy (lfDatabase *db);
01247
01249 LF_EXPORT lfError lf_db_load (lfDatabase *db);
01250
01252 LF_EXPORT lfError lf_db_load_file (lfDatabase *db, const char *filename);
01253
01255 LF_EXPORT lfError lf_db_load_data (lfDatabase *db, const char *errcontext,
01256 const char *data, size_t data_size);
01257
01259 LF_EXPORT lfError lf_db_save_all (const lfDatabase *db, const char *filename);
01260
01262 LF_EXPORT lfError lf_db_save_file (const lfDatabase *db, const char *filename,
01263 const lfMount *const *mounts,
01264 const lfCamera *const *cameras,
01265 const lfLens *const *lenses);
01266
01268 LF_EXPORT char *lf_db_save (const lfMount *const *mounts,
01269 const lfCamera *const *cameras,
01270 const lfLens *const *lenses);
01271
01273 LF_EXPORT const lfCamera **lf_db_find_cameras (
01274 const lfDatabase *db, const char *maker, const char *model);
01275
01277 LF_EXPORT const lfCamera **lf_db_find_cameras_ext (
01278 const lfDatabase *db, const char *maker, const char *model, int sflags);
01279
01281 LF_EXPORT const lfCamera *const *lf_db_get_cameras (const lfDatabase *db);
01282
01284 LF_EXPORT const lfLens **lf_db_find_lenses_hd (
01285 const lfDatabase *db, const lfCamera *camera, const char *maker,
01286 const char *lens, int sflags);
01287
01289 LF_EXPORT const lfLens **lf_db_find_lenses (
01290 const lfDatabase *db, const lfLens *lens, int sflags);
01291
01293 LF_EXPORT const lfLens *const *lf_db_get_lenses (const lfDatabase *db);
01294
01296 LF_EXPORT const lfMount *lf_db_find_mount (const lfDatabase *db, const char *mount);
01297
01299 LF_EXPORT const char *lf_db_mount_name (const lfDatabase *db, const char *mount);
01300
01302 LF_EXPORT const lfMount *const *lf_db_get_mounts (const lfDatabase *db);
01303
01306
01307
01316 enum
01317 {
01319 LF_MODIFY_TCA = 0x00000001,
01321 LF_MODIFY_VIGNETTING = 0x00000002,
01323 LF_MODIFY_CCI = 0x00000004,
01325 LF_MODIFY_DISTORTION = 0x00000008,
01327 LF_MODIFY_GEOMETRY = 0x00000010,
01329 LF_MODIFY_SCALE = 0x00000020,
01331 LF_MODIFY_ALL = ~0
01332 };
01333
01335 enum lfPixelFormat
01336 {
01338 LF_PF_U8,
01340 LF_PF_U16,
01342 LF_PF_U32,
01344 LF_PF_F32,
01346 LF_PF_F64
01347 };
01348
01349 C_TYPEDEF (enum, lfPixelFormat)
01350
01351
01352 enum lfComponentRole
01353 {
01358 LF_CR_END = 0,
01365 LF_CR_NEXT,
01367 LF_CR_UNKNOWN,
01369 LF_CR_INTENSITY,
01371 LF_CR_RED,
01373 LF_CR_GREEN,
01375 LF_CR_BLUE
01376 };
01377
01378 C_TYPEDEF (enum, lfComponentRole)
01379
01380
01381 #define LF_CR_1(a) (LF_CR_ ## a)
01382
01383 #define LF_CR_2(a,b) ((LF_CR_ ## a) | ((LF_CR_ ## b) << 4))
01384
01385 #define LF_CR_3(a,b,c) ((LF_CR_ ## a) | ((LF_CR_ ## b) << 4) | \
01386 ((LF_CR_ ## c) << 8))
01387
01388 #define LF_CR_4(a,b,c,d) ((LF_CR_ ## a) | ((LF_CR_ ## b) << 4) | \
01389 ((LF_CR_ ## c) << 8) | ((LF_CR_ ## d) << 12))
01390
01391 #define LF_CR_5(a,b,c,d,e) ((LF_CR_ ## a) | ((LF_CR_ ## b) << 4) | \
01392 ((LF_CR_ ## c) << 8) | ((LF_CR_ ## d) << 12) | \
01393 ((LF_CR_ ## e) << 16))
01394
01395 #define LF_CR_6(a,b,c,d,e,f) ((LF_CR_ ## a) | ((LF_CR_ ## b) << 4) | \
01396 ((LF_CR_ ## c) << 8) | ((LF_CR_ ## d) << 12) | \
01397 ((LF_CR_ ## e) << 16) | ((LF_CR_ ## f) << 20))
01398
01399 #define LF_CR_7(a,b,c,d,e,f,g) ((LF_CR_ ## a) | ((LF_CR_ ## b) << 4) | \
01400 ((LF_CR_ ## c) << 8) | ((LF_CR_ ## d) << 12) | \
01401 ((LF_CR_ ## e) << 16) | ((LF_CR_ ## f) << 20) | \
01402 ((LF_CR_ ## g) << 24))
01403
01404 #define LF_CR_8(a,b,c,d,e,f,g,h) ((LF_CR_ ## a) | ((LF_CR_ ## b) << 4) | \
01405 ((LF_CR_ ## c) << 8) | ((LF_CR_ ## d) << 12) | \
01406 ((LF_CR_ ## e) << 16) | ((LF_CR_ ## f) << 20) | \
01407 ((LF_CR_ ## g) << 24) | ((LF_CR_ ## h) << 28))
01408
01423 typedef void (*lfSubpixelCoordFunc) (void *data, float *iocoord, int count);
01424
01448 typedef void (*lfModifyColorFunc) (void *data, float x, float y,
01449 void *pixels, int comp_role, int count);
01450
01462 typedef void (*lfModifyCoordFunc) (void *data, float *iocoord, int count);
01463
01523 struct LF_EXPORT lfModifier
01524 {
01525 #ifdef __cplusplus
01526
01546 static lfModifier *Create (const lfLens *lens, float crop, int width, int height);
01547
01588 int Initialize (
01589 const lfLens *lens, lfPixelFormat format, float focal, float aperture,
01590 float distance, float scale, lfLensType targeom, int flags, bool reverse);
01591
01596 void Destroy ();
01597
01614 void AddCoordCallback (lfModifyCoordFunc callback, int priority,
01615 void *data, size_t data_size);
01616
01634 void AddSubpixelCallback (lfSubpixelCoordFunc callback, int priority,
01635 void *data, size_t data_size);
01636
01653 void AddColorCallback (lfModifyColorFunc callback, int priority,
01654 void *data, size_t data_size);
01655
01669 bool AddSubpixelCallbackTCA (lfLensCalibTCA &model, bool reverse = false);
01670
01685 bool AddColorCallbackVignetting (lfLensCalibVignetting &model, lfPixelFormat format,
01686 bool reverse = false);
01687
01702 bool AddColorCallbackCCI (const lfLens *lens, lfPixelFormat format,
01703 bool reverse = false);
01704
01717 bool AddCoordCallbackDistortion (lfLensCalibDistortion &model, bool reverse = false);
01718
01731 bool AddCoordCallbackGeometry (lfLensType from, lfLensType to, float focal);
01732
01748 bool AddCoordCallbackScale (float scale, bool reverse = false);
01749
01762 float GetAutoScale (bool reverse);
01763
01792 bool ApplySubpixelDistortion (float xu, float yu, int width, int height,
01793 float *res) const;
01794
01823 bool ApplyColorModification (void *pixels, float x, float y, int width, int height,
01824 int comp_role, int row_stride) const;
01825
01852 bool ApplyGeometryDistortion (float xu, float yu, int width, int height,
01853 float *res) const;
01854
01882 bool ApplySubpixelGeometryDistortion (float xu, float yu, int width, int height,
01883 float *res) const;
01884
01885 protected:
01886
01887 lfModifier () {}
01888 ~lfModifier () {}
01889 #elif defined _MSC_VER
01890
01891 void *dummy;
01892 #endif
01893 };
01894
01895 C_TYPEDEF (struct, lfModifier)
01896
01897
01898 LF_EXPORT lfModifier *lf_modifier_new (
01899 const lfLens *lens, float crop, int width, int height);
01900
01902 LF_EXPORT void lf_modifier_destroy (lfModifier *modifier);
01903
01905 LF_EXPORT int lf_modifier_initialize (
01906 lfModifier *modifier, const lfLens *lens, lfPixelFormat format,
01907 float focal, float aperture, float distance, float scale,
01908 lfLensType targeom, int flags, cbool reverse);
01909
01911 LF_EXPORT void lf_modifier_add_coord_callback (
01912 lfModifier *modifier, lfModifyCoordFunc callback, int priority,
01913 void *data, size_t data_size);
01914
01916 LF_EXPORT void lf_modifier_add_subpixel_callback (
01917 lfModifier *modifier, lfSubpixelCoordFunc callback, int priority,
01918 void *data, size_t data_size);
01919
01921 LF_EXPORT void lf_modifier_add_color_callback (
01922 lfModifier *modifier, lfModifyColorFunc callback, int priority,
01923 void *data, size_t data_size);
01924
01926 LF_EXPORT cbool lf_modifier_add_subpixel_callback_TCA (
01927 lfModifier *modifier, lfLensCalibTCA *model, cbool reverse);
01928
01930 LF_EXPORT cbool lf_modifier_add_color_callback_vignetting (
01931 lfModifier *modifier, lfLensCalibVignetting *model,
01932 lfPixelFormat format, cbool reverse);
01933
01935 LF_EXPORT cbool lf_modifier_add_color_callback_CCI (
01936 lfModifier *modifier, const lfLens *lens,
01937 lfPixelFormat format, cbool reverse);
01938
01940 LF_EXPORT cbool lf_modifier_add_coord_callback_distortion (
01941 lfModifier *modifier, lfLensCalibDistortion *model, cbool reverse);
01942
01944 LF_EXPORT cbool lf_modifier_add_coord_callback_geometry (
01945 lfModifier *modifier, lfLensType from, lfLensType to, float focal);
01946
01948 LF_EXPORT cbool lf_modifier_add_coord_callback_scale (
01949 lfModifier *modifier, float scale, cbool reverse);
01950
01952 LF_EXPORT float lf_modifier_get_auto_scale (
01953 lfModifier *modifier, cbool reverse);
01954
01956 LF_EXPORT cbool lf_modifier_apply_subpixel_distortion (
01957 lfModifier *modifier, float xu, float yu, int width, int height, float *res);
01958
01960 LF_EXPORT cbool lf_modifier_apply_color_modification (
01961 lfModifier *modifier, void *pixels, float x, float y, int width, int height,
01962 int comp_role, int row_stride);
01963
01965 LF_EXPORT cbool lf_modifier_apply_geometry_distortion (
01966 lfModifier *modifier, float xu, float yu, int width, int height, float *res);
01967
01969 LF_EXPORT cbool lf_modifier_apply_subpixel_geometry_distortion (
01970 lfModifier *modifier, float xu, float yu, int width, int height, float *res);
01971
01974 #undef cbool
01975
01976 #ifdef __cplusplus
01977 }
01978 #endif
01979
01980 #endif