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;
}