#include #include #include #include #include #include using namespace icl::utils; using namespace icl::math; // the line model (y=mx+b) is defined by two values typedef FixedColVector Line; // the fitting is done using standard least squares approach Line fit_line(const std::vector &pts){ int n = pts.size(); DynMatrix xs(n,2), ys(n,1); for(int i=0;i fit = ys * xs.pinv(true); return Line(fit[0],fit[1]); } // distance function for single points (y-distance here) double line_dist(const Line &line, const Point32f &p){ return sqr(line[0] + line[1]*p.x - p.y); } // the original line static const Line THE_LINE(1.23456, 7.89); // create test data: // 50% noisy point on the line // 50% random outliers const std::vector get_line_points(){ Line l = THE_LINE; std::vector pts(100); URand r(-100,100); GRand gr(0,1); for(int i=0;i<50;++i){ pts[i].x = r; pts[i].y = l[0] + l[1]* pts[i].x + gr; } for(int i=0;i<50;++i){ pts[i+50] = Point32f(r,r); } return pts; } int main(int n, char **ppc){ randomSeed(); // create the fitter RansacFitter fitLine(2,1000,fit_line,line_dist,1.5,30); // fit ... RansacFitter::Result r = fitLine.fit(get_line_points()); // show results std::cout << "original line was " << THE_LINE.transp() << std::endl; std::cout << "fitted result was " << r.model.transp() << std::endl; std::cout << "fitting error was " << r.error << std::endl; }