53 template <
typename Estimator,
54 typename SupportMeasurer = InlierSupportMeasurer,
55 typename Sampler = RandomSampler>
66 typename SupportMeasurer::Support
support;
92 const size_t num_samples,
93 const double confidence,
94 const double num_trials_multiplier);
102 Report
Estimate(
const std::vector<typename Estimator::X_t>&
X,
103 const std::vector<typename Estimator::Y_t>& Y);
119 template <
typename Estimator,
typename SupportMeasurer,
typename Sampler>
126 const size_t kNumSamples = 100000;
135 template <
typename Estimator,
typename SupportMeasurer,
typename Sampler>
137 const size_t num_inliers,
138 const size_t num_samples,
139 const double confidence,
140 const double num_trials_multiplier) {
141 const double inlier_ratio = num_inliers /
static_cast<double>(num_samples);
143 const double nom = 1 - confidence;
145 return std::numeric_limits<size_t>::max();
153 return static_cast<size_t>(
154 std::ceil(std::log(nom) / std::log(denom) * num_trials_multiplier));
157 template <
typename Estimator,
typename SupportMeasurer,
typename Sampler>
160 const std::vector<typename Estimator::X_t>&
X,
161 const std::vector<typename Estimator::Y_t>& Y) {
162 CHECK_EQ(
X.size(), Y.size());
164 const size_t num_samples =
X.size();
174 typename SupportMeasurer::Support best_support;
175 typename Estimator::M_t best_model;
179 const double max_residual = options_.max_error * options_.max_error;
181 std::vector<double> residuals(num_samples);
186 sampler.Initialize(num_samples);
188 size_t max_num_trials = options_.max_num_trials;
189 max_num_trials = std::min<size_t>(max_num_trials, sampler.MaxNumSamples());
190 size_t dyn_max_num_trials = max_num_trials;
199 sampler.SampleXY(
X, Y, &X_rand, &Y_rand);
202 const std::vector<typename Estimator::M_t> sample_models =
203 estimator.Estimate(X_rand, Y_rand);
206 for (
const auto& sample_model : sample_models) {
207 estimator.Residuals(
X, Y, sample_model, &residuals);
208 CHECK_EQ(residuals.size(), num_samples);
211 support_measurer.Evaluate(residuals, max_residual);
214 if (support_measurer.Compare(support, best_support)) {
215 best_support = support;
216 best_model = sample_model;
219 ComputeNumTrials(best_support.num_inliers, num_samples,
221 options_.dyn_num_trials_multiplier);
224 if (report.
num_trials >= dyn_max_num_trials &&
225 report.
num_trials >= options_.min_num_trials) {
233 report.
model = best_model;
236 if (report.
support.num_inliers < estimator.kMinNumSamples) {
246 estimator.Residuals(
X, Y, report.
model, &residuals);
247 CHECK_EQ(residuals.size(), num_samples);
250 for (
size_t i = 0; i < residuals.size(); ++i) {
251 report.
inlier_mask[i] = residuals[i] <= max_residual;
RANSAC(const RANSACOptions &options)
SupportMeasurer support_measurer
static size_t ComputeNumTrials(const size_t num_inliers, const size_t num_samples, const double confidence, const double num_trials_multiplier)
Report Estimate(const std::vector< typename Estimator::X_t > &X, const std::vector< typename Estimator::Y_t > &Y)
MiniVec< float, N > ceil(const MiniVec< float, N > &a)
double dyn_num_trials_multiplier
std::vector< char > inlier_mask
SupportMeasurer::Support support