38 #ifndef PCL_SAMPLE_CONSENSUS_IMPL_LMEDS_H_
39 #define PCL_SAMPLE_CONSENSUS_IMPL_LMEDS_H_
44 template <
typename Po
intT>
bool
48 if (threshold_ == std::numeric_limits<double>::max())
50 PCL_ERROR (
"[pcl::LeastMedianSquares::computeModel] No threshold set!\n");
55 double d_best_penalty = std::numeric_limits<double>::max();
57 std::vector<int> best_model;
58 std::vector<int> selection;
59 Eigen::VectorXf model_coefficients;
60 std::vector<double> distances;
62 int n_inliers_count = 0;
64 unsigned skipped_count = 0;
66 const unsigned max_skip = max_iterations_ * 10;
69 while (iterations_ < max_iterations_ && skipped_count < max_skip)
72 sac_model_->getSamples (iterations_, selection);
74 if (selection.empty ())
break;
77 if (!sac_model_->computeModelCoefficients (selection, model_coefficients))
84 double d_cur_penalty = 0;
88 sac_model_->getDistancesToModel (model_coefficients, distances);
91 if (distances.empty ())
98 std::sort (distances.begin (), distances.end ());
100 size_t mid = sac_model_->getIndices ()->size () / 2;
101 if (mid >= distances.size ())
109 if (sac_model_->getIndices ()->size () % 2 == 0)
110 d_cur_penalty = (
sqrt (distances[mid-1]) +
sqrt (distances[mid])) / 2;
112 d_cur_penalty =
sqrt (distances[mid]);
115 if (d_cur_penalty < d_best_penalty)
117 d_best_penalty = d_cur_penalty;
121 model_coefficients_ = model_coefficients;
125 if (debug_verbosity_level > 1)
126 PCL_DEBUG (
"[pcl::LeastMedianSquares::computeModel] Trial %d out of %d. Best penalty is %f.\n", iterations_, max_iterations_, d_best_penalty);
131 if (debug_verbosity_level > 0)
132 PCL_DEBUG (
"[pcl::LeastMedianSquares::computeModel] Unable to find a solution!\n");
143 sac_model_->getDistancesToModel (model_coefficients_, distances);
145 if (distances.empty ())
147 PCL_ERROR (
"[pcl::LeastMedianSquares::computeModel] The model found failed to verify against the given constraints!\n");
151 std::vector<int> &indices = *sac_model_->getIndices ();
153 if (distances.size () != indices.size ())
155 PCL_ERROR (
"[pcl::LeastMedianSquares::computeModel] Estimated distances (%zu) differs than the normal of indices (%zu).\n", distances.size (), indices.size ());
159 inliers_.resize (distances.size ());
162 for (
size_t i = 0; i < distances.size (); ++i)
163 if (distances[i] <= threshold_)
164 inliers_[n_inliers_count++] = indices[i];
167 inliers_.resize (n_inliers_count);
169 if (debug_verbosity_level > 0)
170 PCL_DEBUG (
"[pcl::LeastMedianSquares::computeModel] Model: %zu size, %d inliers.\n", model_.size (), n_inliers_count);
175 #define PCL_INSTANTIATE_LeastMedianSquares(T) template class PCL_EXPORTS pcl::LeastMedianSquares<T>;
177 #endif // PCL_SAMPLE_CONSENSUS_IMPL_LMEDS_H_