vl_size run_non_maxima_suppression()

in opensfm/src/features/src/hahog.cc [36:68]


vl_size run_non_maxima_suppression(VlCovDet *covdet, vl_size num_features,
                                   double non_extrema_suppression) {
  vl_index i, j;
  double tol = non_extrema_suppression;
  VlCovDetFeature *features = (VlCovDetFeature *)vl_covdet_get_features(covdet);
  for (i = 0; i < (signed)num_features; ++i) {
    double x = features[i].frame.x;
    double y = features[i].frame.y;
    double sigma = features[i].frame.a11;
    double score = features[i].peakScore;

    for (j = 0; j < (signed)num_features; ++j) {
      double dx_ = features[j].frame.x - x;
      double dy_ = features[j].frame.y - y;
      double sigma_ = features[j].frame.a11;
      double score_ = features[j].peakScore;
      if (score_ == 0) continue;
      if (sigma < (1 + tol) * sigma_ && sigma_ < (1 + tol) * sigma &&
          vl_abs_d(dx_) < tol * sigma && vl_abs_d(dy_) < tol * sigma &&
          vl_abs_d(score) > vl_abs_d(score_)) {
        features[j].peakScore = 0;
      }
    }
  }
  j = 0;
  for (i = 0; i < (signed)num_features; ++i) {
    VlCovDetFeature feature = features[i];
    if (features[i].peakScore != 0) {
      features[j++] = feature;
    }
  }
  return j;
}