Files
rawTherapee/rtengine/klt/klt.h
Hombre 8b2eac9a3d Pipette and "On Preview Widgets" branch. See issue 227
The pipette part is already working quite nice but need to be finished. The widgets part needs more work...
2014-01-21 23:37:36 +01:00

245 lines
6.1 KiB
C

/*********************************************************************
* klt.h
*
* Kanade-Lucas-Tomasi tracker
*********************************************************************/
#ifndef _KLT_H_
#define _KLT_H_
#ifdef __cplusplus
extern "C" {
#endif
typedef float KLT_locType;
typedef unsigned char KLT_PixelType;
#define KLT_BOOL int
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif
#ifndef NULL
#define NULL 0
#endif
#define KLT_TRACKED 0
#define KLT_NOT_FOUND -1
#define KLT_SMALL_DET -2
#define KLT_MAX_ITERATIONS -3
#define KLT_OOB -4
#define KLT_LARGE_RESIDUE -5
#include "klt_util.h" /* for affine mapping */
/*******************
* Structures
*/
typedef struct {
/* Available to user */
int mindist; /* min distance b/w features */
int window_width, window_height;
KLT_BOOL sequentialMode; /* whether to save most recent image to save time */
/* can set to TRUE manually, but don't set to */
/* FALSE manually */
KLT_BOOL smoothBeforeSelecting; /* whether to smooth image before */
/* selecting features */
KLT_BOOL writeInternalImages; /* whether to write internal images */
/* tracking features */
KLT_BOOL lighting_insensitive; /* whether to normalize for gain and bias (not in original algorithm) */
/* Available, but hopefully can ignore */
int min_eigenvalue; /* smallest eigenvalue allowed for selecting */
float min_determinant; /* th for determining lost */
float min_displacement; /* th for stopping tracking when pixel changes little */
int max_iterations; /* th for stopping tracking when too many iterations */
float max_residue; /* th for stopping tracking when residue is large */
float grad_sigma;
float smooth_sigma_fact;
float pyramid_sigma_fact;
float step_factor; /* size of Newton steps; 2.0 comes from equations, 1.0 seems to avoid overshooting */
int nSkippedPixels; /* # of pixels skipped when finding features */
int borderx; /* border in which features will not be found */
int bordery;
int nPyramidLevels; /* computed from search_ranges */
int subsampling; /* " */
/* for affine mapping */
int affine_window_width, affine_window_height;
int affineConsistencyCheck; /* whether to evaluates the consistency of features with affine mapping
-1 = don't evaluates the consistency
0 = evaluates the consistency of features with translation mapping
1 = evaluates the consistency of features with similarity mapping
2 = evaluates the consistency of features with affine mapping
*/
int affine_max_iterations;
float affine_max_residue;
float affine_min_displacement;
float affine_max_displacement_differ; /* th for the difference between the displacement calculated
by the affine tracker and the frame to frame tracker in pel*/
/* User must not touch these */
void *pyramid_last;
void *pyramid_last_gradx;
void *pyramid_last_grady;
} KLT_TrackingContextRec, *KLT_TrackingContext;
typedef struct {
KLT_locType x;
KLT_locType y;
int val;
/* for affine mapping */
_KLT_FloatImage aff_img;
_KLT_FloatImage aff_img_gradx;
_KLT_FloatImage aff_img_grady;
KLT_locType aff_x;
KLT_locType aff_y;
KLT_locType aff_Axx;
KLT_locType aff_Ayx;
KLT_locType aff_Axy;
KLT_locType aff_Ayy;
} KLT_FeatureRec, *KLT_Feature;
typedef struct {
int nFeatures;
KLT_Feature *feature;
} KLT_FeatureListRec, *KLT_FeatureList;
typedef struct {
int nFrames;
KLT_Feature *feature;
} KLT_FeatureHistoryRec, *KLT_FeatureHistory;
typedef struct {
int nFrames;
int nFeatures;
KLT_Feature **feature;
} KLT_FeatureTableRec, *KLT_FeatureTable;
/*******************
* Functions
*/
/* Create */
KLT_TrackingContext KLTCreateTrackingContext(void);
KLT_FeatureList KLTCreateFeatureList(
int nFeatures);
KLT_FeatureHistory KLTCreateFeatureHistory(
int nFrames);
KLT_FeatureTable KLTCreateFeatureTable(
int nFrames,
int nFeatures);
/* Free */
void KLTFreeTrackingContext(
KLT_TrackingContext tc);
void KLTFreeFeatureList(
KLT_FeatureList fl);
void KLTFreeFeatureHistory(
KLT_FeatureHistory fh);
void KLTFreeFeatureTable(
KLT_FeatureTable ft);
/* Processing */
void KLTSelectGoodFeatures(
KLT_TrackingContext tc,
KLT_PixelType *img,
int ncols,
int nrows,
KLT_FeatureList fl);
void KLTTrackFeatures(
KLT_TrackingContext tc,
KLT_PixelType *img1,
KLT_PixelType *img2,
int ncols,
int nrows,
KLT_FeatureList fl);
void KLTReplaceLostFeatures(
KLT_TrackingContext tc,
KLT_PixelType *img,
int ncols,
int nrows,
KLT_FeatureList fl);
/* Utilities */
int KLTCountRemainingFeatures(
KLT_FeatureList fl);
void KLTPrintTrackingContext(
KLT_TrackingContext tc);
void KLTChangeTCPyramid(
KLT_TrackingContext tc,
int search_range);
void KLTUpdateTCBorder(
KLT_TrackingContext tc);
void KLTStopSequentialMode(
KLT_TrackingContext tc);
void KLTSetVerbosity(
int verbosity);
float _KLTComputeSmoothSigma(
KLT_TrackingContext tc);
/* Storing/Extracting Features */
void KLTStoreFeatureList(
KLT_FeatureList fl,
KLT_FeatureTable ft,
int frame);
void KLTExtractFeatureList(
KLT_FeatureList fl,
KLT_FeatureTable ft,
int frame);
void KLTStoreFeatureHistory(
KLT_FeatureHistory fh,
KLT_FeatureTable ft,
int feat);
void KLTExtractFeatureHistory(
KLT_FeatureHistory fh,
KLT_FeatureTable ft,
int feat);
/* Writing/Reading */
void KLTWriteFeatureListToPPM(
KLT_FeatureList fl,
KLT_PixelType *greyimg,
int ncols,
int nrows,
const char *filename);
void KLTWriteFeatureList(
KLT_FeatureList fl,
const char *filename,
const char *fmt);
void KLTWriteFeatureHistory(
KLT_FeatureHistory fh,
const char *filename,
const char *fmt);
void KLTWriteFeatureTable(
KLT_FeatureTable ft,
const char *filename,
const char *fmt);
KLT_FeatureList KLTReadFeatureList(
KLT_FeatureList fl,
const char *filename);
KLT_FeatureHistory KLTReadFeatureHistory(
KLT_FeatureHistory fh,
const char *filename);
KLT_FeatureTable KLTReadFeatureTable(
KLT_FeatureTable ft,
const char *filename);
#ifdef __cplusplus
}
#endif
#endif