#include "../headers/RANSAC.h" #include #include #include RANSAC::RANSAC() :probability_(0.99), max_iterations_ (10) { } int RANSAC::compute(lr& mylr, double x[], double y[],int numbers,int num_for_estimate,bool *choose) { int num_data = numbers; int iterations = 0; double k = 100; double log_probability = log (1.0 - probability_); double one_over_indices = 1.0 / static_cast (num_data); short *best_votes = new short[num_data]; short *cur_votes = new short[num_data]; SubSetIndexComparator sub_set_index_comparator(num_for_estimate); std::set chosen_sub_sets(sub_set_index_comparator); int* cur_inti_sub_set_indexs = NULL; int best_model_num = -1; int maybe_inliers_num = 0; std::vector maybe_model; std::vector shuffled_indices(num_data); while (iterations < k) { maybe_inliers_num = 0; cur_inti_sub_set_indexs = new int[num_for_estimate]; maybe_model.clear(); for (int i=0;i < (int)shuffled_indices.size(); i++) { shuffled_indices[i]=i; } int max_index = num_data-1; for (int i=0; i::iterator, bool > res = chosen_sub_sets.insert(cur_inti_sub_set_indexs); if (res.second) { std::vector tmpx; std::vector tmpy; for (int i=0; i best_model_num) { best_model_num = maybe_inliers_num; memcpy(best_votes, cur_votes, num_data*sizeof(short)); } //k=log(1-p)/log(1-pow(w,n)) double w = static_cast (best_model_num) * one_over_indices; double p_no_outliers = 1.0 - std::pow(w, static_cast (maybe_inliers_num)); if(abs(p_no_outliers-1.0)::epsilon ()){ break; } p_no_outliers = (std::max) (std::numeric_limits::epsilon (), p_no_outliers); // Avoid division by -Inf p_no_outliers = (std::min) (1.0 - std::numeric_limits::epsilon (), p_no_outliers); // Avoid division by 0. k = log_probability / log(p_no_outliers); //std::cout<<"log_probability: "<::iterator it = chosen_sub_sets.begin(); std::set::iterator chosenSubSetsEnd = chosen_sub_sets.end(); while(it!=chosenSubSetsEnd) { delete [] (*it); it++; } chosen_sub_sets.clear(); std::vector choosex(best_model_num, 0); std::vector choosey(best_model_num, 0); int k1=0; int k2=0; for(int j=0; j