⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 selectgoodfeatures.c

📁 KLT: An Implementation of the Kanade-Lucas-Tomasi Feature Tracker KLT: An Implementation of the
💻 C
📖 第 1 页 / 共 2 页
字号:
  qsort(pointlist, npoints, 3*sizeof(int), _comparePoints);#else  _quicksort(pointlist, npoints);#endif}/********************************************************************* * _minEigenvalue * * Given the three distinct elements of the symmetric 2x2 matrix *                     [gxx gxy] *                     [gxy gyy], * Returns the minimum eigenvalue of the matrix.   */static float _minEigenvalue(float gxx, float gxy, float gyy){  return (float) ((gxx + gyy - sqrt((gxx - gyy)*(gxx - gyy) + 4*gxy*gxy))/2.0f);}	/*********************************************************************/void _KLTSelectGoodFeatures(  KLT_TrackingContext tc,  KLT_PixelType *img,   int ncols,   int nrows,  KLT_FeatureList featurelist,  selectionMode mode){  _KLT_FloatImage floatimg, gradx, grady;  int window_hw, window_hh;  int *pointlist;  int npoints = 0;  KLT_BOOL overwriteAllFeatures = (mode == SELECTING_ALL) ?    TRUE : FALSE;  KLT_BOOL floatimages_created = FALSE;  /* Check window size (and correct if necessary) */  if (tc->window_width % 2 != 1) {    tc->window_width = tc->window_width+1;    KLTWarning("Tracking context's window width must be odd.  "               "Changing to %d.\n", tc->window_width);  }  if (tc->window_height % 2 != 1) {    tc->window_height = tc->window_height+1;    KLTWarning("Tracking context's window height must be odd.  "               "Changing to %d.\n", tc->window_height);  }  if (tc->window_width < 3) {    tc->window_width = 3;    KLTWarning("Tracking context's window width must be at least three.  \n"               "Changing to %d.\n", tc->window_width);  }  if (tc->window_height < 3) {    tc->window_height = 3;    KLTWarning("Tracking context's window height must be at least three.  \n"               "Changing to %d.\n", tc->window_height);  }  window_hw = tc->window_width/2;   window_hh = tc->window_height/2;		  /* Create pointlist, which is a simplified version of a featurelist, */  /* for speed.  Contains only integer locations and values. */  pointlist = (int *) malloc(ncols * nrows * 3 * sizeof(int));  /* Create temporary images, etc. */  if (mode == REPLACING_SOME &&       tc->sequentialMode && tc->pyramid_last != NULL)  {    floatimg = ((_KLT_Pyramid) tc->pyramid_last)->img[0];    gradx = ((_KLT_Pyramid) tc->pyramid_last_gradx)->img[0];    grady = ((_KLT_Pyramid) tc->pyramid_last_grady)->img[0];    assert(gradx != NULL);    assert(grady != NULL);  } else  {    floatimages_created = TRUE;    floatimg = _KLTCreateFloatImage(ncols, nrows);    gradx    = _KLTCreateFloatImage(ncols, nrows);    grady    = _KLTCreateFloatImage(ncols, nrows);    if (tc->smoothBeforeSelecting)  {      _KLT_FloatImage tmpimg;      tmpimg = _KLTCreateFloatImage(ncols, nrows);      _KLTToFloatImage(img, ncols, nrows, tmpimg);      _KLTComputeSmoothedImage(tmpimg, _KLTComputeSmoothSigma(tc), floatimg);      _KLTFreeFloatImage(tmpimg);    } else _KLTToFloatImage(img, ncols, nrows, floatimg);     /* Compute gradient of image in x and y direction */    _KLTComputeGradients(floatimg, tc->grad_sigma, gradx, grady);  }	  /* Write internal images */  if (tc->writeInternalImages)  {    _KLTWriteFloatImageToPGM(floatimg, "kltimg_sgfrlf.pgm");    _KLTWriteFloatImageToPGM(gradx, "kltimg_sgfrlf_gx.pgm");    _KLTWriteFloatImageToPGM(grady, "kltimg_sgfrlf_gy.pgm");  }  /* Compute trackability of each image pixel as the minimum     of the two eigenvalues of the Z matrix */  {    register float gx, gy;    register float gxx, gxy, gyy;    register int xx, yy;    register int *ptr;    float val;    unsigned int limit = 1;    int borderx = tc->borderx;	/* Must not touch cols */    int bordery = tc->bordery;	/* lost by convolution */    int x, y;    int i;	    if (borderx < window_hw)  borderx = window_hw;    if (bordery < window_hh)  bordery = window_hh;    /* Find largest value of an int */    for (i = 0 ; i < sizeof(int) ; i++)  limit *= 256;    limit = limit/2 - 1;		    /* For most of the pixels in the image, do ... */    ptr = pointlist;    for (y = bordery ; y < nrows - bordery ; y += tc->nSkippedPixels + 1)      for (x = borderx ; x < ncols - borderx ; x += tc->nSkippedPixels + 1)  {        /* Sum the gradients in the surrounding window */        gxx = 0;  gxy = 0;  gyy = 0;        for (yy = y-window_hh ; yy <= y+window_hh ; yy++)          for (xx = x-window_hw ; xx <= x+window_hw ; xx++)  {            gx = *(gradx->data + ncols*yy+xx);            gy = *(grady->data + ncols*yy+xx);            gxx += gx * gx;            gxy += gx * gy;            gyy += gy * gy;          }        /* Store the trackability of the pixel as the minimum           of the two eigenvalues */        *ptr++ = x;        *ptr++ = y;        val = _minEigenvalue(gxx, gxy, gyy);        if (val > limit)  {          KLTWarning("(_KLTSelectGoodFeatures) minimum eigenvalue %f is "                     "greater than the capacity of an int; setting "                     "to maximum value", val);          val = (float) limit;        }        *ptr++ = (int) val;        npoints++;      }  }			  /* Sort the features  */  _sortPointList(pointlist, npoints);  /* Check tc->mindist */  if (tc->mindist < 0)  {    KLTWarning("(_KLTSelectGoodFeatures) Tracking context field tc->mindist "               "is negative (%d); setting to zero", tc->mindist);    tc->mindist = 0;  }  /* Enforce minimum distance between features */  _enforceMinimumDistance(    pointlist,    npoints,    featurelist,    ncols, nrows,    tc->mindist,    tc->min_eigenvalue,    overwriteAllFeatures);  /* Free memory */  free(pointlist);  if (floatimages_created)  {    _KLTFreeFloatImage(floatimg);    _KLTFreeFloatImage(gradx);    _KLTFreeFloatImage(grady);  }}/********************************************************************* * KLTSelectGoodFeatures * * Main routine, visible to the outside.  Finds the good features in * an image.   *  * INPUTS * tc:	Contains parameters used in computation (size of image, *        size of window, min distance b/w features, sigma to compute *        image gradients, # of features desired). * img:	Pointer to the data of an image (probably unsigned chars). *  * OUTPUTS * features:	List of features.  The member nFeatures is computed. */void KLTSelectGoodFeatures(  KLT_TrackingContext tc,  KLT_PixelType *img,   int ncols,   int nrows,  KLT_FeatureList fl){  if (KLT_verbose >= 1)  {    fprintf(stderr,  "(KLT) Selecting the %d best features "            "from a %d by %d image...  ", fl->nFeatures, ncols, nrows);    fflush(stderr);  }  _KLTSelectGoodFeatures(tc, img, ncols, nrows,                          fl, SELECTING_ALL);  if (KLT_verbose >= 1)  {    fprintf(stderr,  "\n\t%d features found.\n",             KLTCountRemainingFeatures(fl));    if (tc->writeInternalImages)      fprintf(stderr,  "\tWrote images to 'kltimg_sgfrlf*.pgm'.\n");    fflush(stderr);  }}/********************************************************************* * KLTReplaceLostFeatures * * Main routine, visible to the outside.  Replaces the lost features  * in an image.   *  * INPUTS * tc:	Contains parameters used in computation (size of image, *        size of window, min distance b/w features, sigma to compute *        image gradients, # of features desired). * img:	Pointer to the data of an image (probably unsigned chars). *  * OUTPUTS * features:	List of features.  The member nFeatures is computed. */void KLTReplaceLostFeatures(  KLT_TrackingContext tc,  KLT_PixelType *img,   int ncols,   int nrows,  KLT_FeatureList fl){  int nLostFeatures = fl->nFeatures - KLTCountRemainingFeatures(fl);  if (KLT_verbose >= 1)  {    fprintf(stderr,  "(KLT) Attempting to replace %d features "            "in a %d by %d image...  ", nLostFeatures, ncols, nrows);    fflush(stderr);  }  /* If there are any lost features, replace them */  if (nLostFeatures > 0)    _KLTSelectGoodFeatures(tc, img, ncols, nrows,                            fl, REPLACING_SOME);  if (KLT_verbose >= 1)  {    fprintf(stderr,  "\n\t%d features replaced.\n",            nLostFeatures - fl->nFeatures + KLTCountRemainingFeatures(fl));    if (tc->writeInternalImages)      fprintf(stderr,  "\tWrote images to 'kltimg_sgfrlf*.pgm'.\n");    fflush(stderr);  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -