38 #ifndef PCL_REGISTRATION_IMPL_CORRESPONDENCE_REJECTION_VAR_TRIMMED_HPP_
39 #define PCL_REGISTRATION_IMPL_CORRESPONDENCE_REJECTION_VAR_TRIMMED_HPP_
50 std::vector <double> dists;
51 dists.resize (original_correspondences.size ());
53 for (
size_t i = 0; i < original_correspondences.size (); ++i)
57 dists[i] = data_container_->getCorrespondenceScore (original_correspondences[i]);
61 dists[i] = original_correspondences[i].distance;
64 factor_ = optimizeInlierRatio (dists);
65 nth_element (dists.begin (), dists.begin () + int (dists.size () * factor_), dists.end ());
66 trimmed_distance_ = dists [int (dists.size () * factor_)];
68 unsigned int number_valid_correspondences = 0;
69 remaining_correspondences.resize (original_correspondences.size ());
71 for (
size_t i = 0; i < original_correspondences.size (); ++i)
73 if ( dists[i] < trimmed_distance_)
75 remaining_correspondences[number_valid_correspondences] = original_correspondences[i];
76 ++number_valid_correspondences;
79 remaining_correspondences.resize (number_valid_correspondences);
84 pcl::registration::CorrespondenceRejectorVarTrimmed::optimizeInlierRatio (std::vector <double>& dists)
86 unsigned int points_nbr = dists.size ();
87 std::sort (dists.begin (), dists.end ());
89 const int min_el = int (floor (min_ratio_ * points_nbr));
90 const int max_el = int (floor (max_ratio_ * points_nbr));
92 typedef Eigen::Array <double, Eigen::Dynamic, 1> LineArray;
93 Eigen::Map<LineArray> sorted_dist (&dists[0], points_nbr);
95 const LineArray trunk_sorted_dist = sorted_dist.segment (min_el, max_el-min_el);
96 const double lower_sum = sorted_dist.head (min_el).sum ();
97 const LineArray ids = LineArray::LinSpaced (trunk_sorted_dist.rows (), min_el+1, max_el);
98 const LineArray ratio = ids / points_nbr;
99 const LineArray deno = ratio.pow (lambda_);
100 const LineArray FRMS = deno.inverse ().square () * ids.inverse () * (lower_sum + trunk_sorted_dist);
102 FRMS.minCoeff (&min_index);
104 const float opt_ratio = float (min_index + min_el) / float (points_nbr);