46 #ifndef BSFM_RANSAC_RANSAC_H
47 #define BSFM_RANSAC_RANSAC_H
50 #include <glog/logging.h>
57 template <
typename DataType,
typename ModelType>
77 template <
typename DataType,
typename ModelType>
82 template <
typename DataType,
typename ModelType>
89 double best_error = std::numeric_limits<double>::infinity();
92 for (
unsigned int iter = 0; iter < options_.iterations; ++iter) {
94 std::vector<DataType> sampled = problem.
SampleData(options_.num_samples);
97 ModelType initial_model = problem.
FitModel(sampled);
100 std::vector<DataType> unsampled = problem.
RemainingData(options_.num_samples);
101 std::vector<DataType> inliers(sampled);
102 for (
const auto& not_sampled_data_point : unsampled) {
103 if (initial_model.IsGoodFit(not_sampled_data_point,
104 options_.acceptable_error)) {
105 inliers.push_back(not_sampled_data_point);
110 if (inliers.size() >= options_.minimum_num_inliers) {
113 ModelType better_model = problem.
FitModel(inliers);
116 double this_error = better_model.Error();
117 if (this_error < best_error) {
118 best_error = this_error;
128 VLOG(1) <<
"RANSAC failed to find a solution in " << options_.iterations
virtual void SetSolutionFound(bool solution_found)
void SetOptions(const RansacOptions &options)
virtual std::vector< DataType > RemainingData(unsigned int num_sampled_previously) const =0
virtual void SetInliers(const std::vector< DataType > &inliers)
bool Run(RansacProblem< DataType, ModelType > &problem) const
virtual void SetModel(const ModelType &model)
virtual std::vector< DataType > SampleData(unsigned int num_samples)=0
virtual ModelType FitModel(const std::vector< DataType > &input_data) const =0
virtual bool SolutionFound()