245 lines
6.1 KiB
C
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
|
|
|
|
|
|
|
|
|
|
|
|
|