91 if (similarity_threshold_ < 0.0f || similarity_threshold_ > 1.0f) {
93 "[pcl::registration::%s::getRemainingCorrespondences] Invalid edge length "
94 "similarity - must be in [0,1]!. Returning all input correspondences.\n",
95 getClassName().c_str());
100 similarity_threshold_squared_ = similarity_threshold_ * similarity_threshold_;
103 remaining_correspondences.clear();
104 remaining_correspondences.reserve(nr_correspondences);
107 std::vector<int> num_samples(nr_correspondences, 0);
108 std::vector<int> num_accepted(nr_correspondences, 0);
111 for (
int i = 0; i < iterations_; ++i) {
113 const std::vector<int> idx =
114 getUniqueRandomIndices(nr_correspondences, cardinality_);
117 if (thresholdPolygon(original_correspondences, idx)) {
119 for (
int j = 0; j < cardinality_; ++j) {
120 ++num_samples[idx[j]];
121 ++num_accepted[idx[j]];
126 for (
int j = 0; j < cardinality_; ++j)
127 ++num_samples[idx[j]];
132 std::vector<float> accept_rate(nr_correspondences, 0.0f);
133 for (
int i = 0; i < nr_correspondences; ++i) {
134 const int numsi = num_samples[i];
136 accept_rate[i] = 0.0f;
138 accept_rate[i] =
static_cast<float>(num_accepted[i]) /
static_cast<float>(numsi);
142 const int hist_size = nr_correspondences / 2;
143 const std::vector<int> histogram =
144 computeHistogram(accept_rate, 0.0f, 1.0f, hist_size);
147 const int cut_idx = findThresholdOtsu(histogram);
148 const float cut =
static_cast<float>(cut_idx) /
static_cast<float>(hist_size);
151 for (
int i = 0; i < nr_correspondences; ++i)
152 if (accept_rate[i] > cut)
153 remaining_correspondences.push_back(original_correspondences[i]);