## KLTSelectGoodFeatures()

## `void KLTSelectGoodFeatures(
KLT_TrackingContext tc,
KLT_PixelType *img,
int ncols,
int nrows,
KLT_FeatureList fl);
`

KLTSelectGoodFeatures() takes an image pointed to by `img`. (NOTE: `KLT_PixelType` is, unless modified by the user, an `unsigned char`.) If `tc->smoothBeforeSelecting` is set to `TRUE`, then the image is smoothed by convolving with a Gaussian of sigma = `tc->smooth_sigma_fact * max(tc->window_width, tc->window_height)`; otherwise, the image is not smoothed. In either case, gradients are computed from the resulting image by convolving with the derivative of a Gaussian of sigma = `tc->grad_sigma`. These gradients (one in the x direction and the other in the y direction) are used to select the features.

Pixels throughout the image are then measured as to their "goodness", which is a measure of their trackability. Generally each pixel within the image's interior is considered, where the interior is defined by `tc->borderx` and `tc->bordery` (i.e., setting these parameters to zero causes the interior to equal the whole image). The parameter `tc->nSkippedPixels` can be used to speed up the process in the following way: its default value is zero, in which case every pixel within the interior is considered; if it is set to one, then every other pixel within the interior is considered; setting it to two causes every third pixel to be considered; and similarly for higher values. Since neighboring pixels generally have similar goodness values, then skipping every other one will probably not noticeably decrease performance.

The goodness of each pixel is measured as the minimum eigenvalue of the 2 by 2 gradient matrix computed from the `tc->window_width` by `tc->window_height` window around the pixel. After all the pixels have been considered, they are sorted in descending order according to goodness. Then, one by one the top `fl->nFeatures` features (or pixels) whose minimum eigenvalue is at least `tc->min_eigenvalue` are selected, ensuring that each new feature is at least `tc->mindist` pixels away from all the other features.

If `tc->writeInternalImages` is `TRUE`, then the smoothed image and the image derivatives are written to `"kltimg_sgfrlf.pgm"`, `"kltimg_sgfrlf_gx.pgm"`, and `"kltimg_sgfrlf_gy.pgm"`, respectively. This allows the user to more intelligently select the parameters for smoothing and differentiating.