1 #include <MathAlgo/PreemptiveRANSAC.hh>
2 #include <Base/Common/CompareFloatingPoint.hh>
3 #include <Base/Debug/TimeMeasure.hh>
5 #include "MeanDoubleRANSACEvaluator.hh"
6 #include "TestMeanDoubleHelper.hh"
13 const double max_outlier_fraction = 0.5;
15 void DebugOut(
const unsigned t,
const unsigned num_data,
16 const unsigned num_outliers,
const double sigma3,
17 const int ret_val_solve_master,
const vector<double> &data,
18 const vector<bool> >_inliers,
const double gt_mean,
19 const double &est_mean,
const unsigned est_num_inliers,
20 const double &score,
const double &max_score);
22 int main(
int argc,
char *argv[])
24 const unsigned num_tries = 200;
27 const unsigned min_sample_size =
29 const int debug_try = -1;
39 for (
unsigned t=0; t<num_tries; t++){
44 num_data = min_sample_size;
45 }
else if (t==1 && min_sample_size>1){
47 num_data = min_sample_size-1;
49 const unsigned min_num_outliers = (unsigned)floor(0.1*(
double)num_data);
50 unsigned max_num_outliers =
51 (unsigned)floor(max_outlier_fraction*(
double)num_data);
52 if (num_data>=min_sample_size && max_num_outliers+min_sample_size>num_data){
53 max_num_outliers = num_data-min_sample_size;
55 const unsigned num_outliers =
60 vector<bool> gt_inliers, est_inliers;
61 double gt_mean, est_mean;
62 if (t==(
unsigned)debug_try) verbose =
true;
64 cout <<
"------------ "<<t<<
" -------------\n";
69 cout <<
" "<<num_data<<
" samples ("<<num_outliers<<
" outliers)\n"
70 <<
" mean: "<<gt_mean<<
" \tsigma3: "<<sigma3<<endl;
72 if (t==(
unsigned)debug_try){
73 mdpr.AddDebugLevel(
"D_PRANSAC_SolveMaster");
74 mdpr.AddDebugLevel(
"D_PRANSAC_Evaluate");
75 mdpr.AddDebugLevel(
"D_PRANSAC_InitialReject");
76 mdpr.AddDebugLevel(
"D_PRANSAC_GetSolution");
77 mdpr.AddDebugLevel(
"D_PRANSAC_GenerateSolutions");
80 mdch.
Init(data, sigma3);
82 cout<<
"Exception failed:"<<ex.
What()<<endl;
89 double inlying_data_fraction = 1.0-max_outlier_fraction-0.01;
90 const double max_score = 100.0;
93 const bool auto_compute_max_samples =
true;
97 int res = mdpr.SolveMaster(inlying_data_fraction, max_score, est_mean,
98 est_inliers, num_inliers, score,
99 auto_compute_max_samples);
104 if (num_data < min_sample_size){
105 if (res != PRANSAC_NOTE_ENOUGH_SAMPLES){
106 cerr <<
"invalid return value when not enough samples are present\n";
111 DebugOut(t, num_data, num_outliers, sigma3, res, data, gt_inliers,
112 gt_mean, est_mean, num_inliers, score, max_score);
118 cout <<
" found solution: "<<est_mean<<
" (gt is "<<gt_mean<<
", diff "
119 <<fabs(est_mean-gt_mean)/sigma3<<
"*sigma3)\n";
120 if (!
CheckResult(est_inliers, est_mean, gt_inliers, gt_mean, sigma3)){
121 DebugOut(t, num_data, num_outliers, sigma3, res, data, gt_inliers,
122 gt_mean, est_mean, num_inliers, score, max_score);
123 cerr <<
"wrong result\n";
127 cout <<
"#" << flush;
136 void DebugOut(
const unsigned t,
const unsigned num_data,
137 const unsigned num_outliers,
const double sigma3,
138 const int ret_val_solve_master,
const vector<double> &data,
139 const vector<bool> >_inliers,
const double gt_mean,
140 const double &est_mean,
const unsigned est_num_inliers,
141 const double &score,
const double &max_score)
143 cerr <<
"\n---- try "<<t<<
" -------\n"
144 <<
"(num samples: "<<num_data
145 <<
", num_outliers: "<<num_outliers<<
", sigma3: "<<sigma3<<
"): res="
146 <<ret_val_solve_master<<endl;
147 if (ret_val_solve_master<0){
148 cerr <<
"Error computing solution\n";
149 }
else if (ret_val_solve_master>0){
150 cerr <<
"Solution violates min quality criteria\n";
151 cout <<
"estimated num inliers: "<<est_num_inliers
152 <<
" (expected min "<<num_data-num_outliers<<
")\n";
153 cout <<
"estimated score: "<<score
154 <<
" (expected max "<<max_score<<
")\n";
156 for (
unsigned k=0; k<data.size(); k++){
157 cout << data[k]<<
"("<<((gt_inliers[k])?(
"+"):(
"-"))<<
") ";
160 cout <<
"gt_mean : "<<gt_mean<<endl;
161 cout <<
"est_mean: "<<est_mean<<endl;
162 cout <<
"est num inliers: "<<est_num_inliers<<endl;
163 cout <<
"est score: "<<score<<endl;
helper class for implementation of PreemptievRANSAC and COSAC for robust computation of the mean of a...
double GetUniformDistributed(const double min, const double max)
on succesive calls return uniform distributed random variable between min and max ...
unsigned GetMinNumSamplesForSolutionComputation() const
Returns the minimum required samples for computation of a solution.
int GetUniformDistributedInt(const int min, const int max)
get uniform distributed random variable including min/max
int Init(const std::vector< double > &data, const double &sigma3)
bool CheckResult(const std::vector< bool > &est_inliers, const double &est_mean, const std::vector< bool > >_inliers, const double >_mean, const double >_sigma3)
bool GenerateRandomData(Random &MyRandom, const unsigned num_data, const unsigned num_outliers, const double sigma3, const unsigned min_sample_size, std::vector< double > &data, std::vector< bool > &inliers, double &mean)
Fast RANSAC after David Nister, "Preemptive RANSAC for Live Structure And Motion Estimation", Internation Conference on Computer Vision (ICCV) 2003.
class for producing random numbers from different distributions
class TimeMeasure contains functions for timing real time and cpu time.
virtual const std::string & What() const