Go to the documentation of this file.00001 #ifndef FMatrixComputeRobust_h_
00002 #define FMatrixComputeRobust_h_
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 #include <mvl/FMatrixCompute.h>
00022 #include <mvl/HomgPoint2D.h>
00023 #include <vgl/vgl_homg_point_2d.h>
00024 #include <vcl_vector.h>
00025 
00026 class FMatrixComputeRobust : public FMatrixCompute
00027 {
00028  public:
00029   FMatrixComputeRobust();
00030   virtual ~FMatrixComputeRobust();
00031 
00032   
00033 
00034   
00035   
00036   bool compute(PairMatchSetCorner& matches, FMatrix* F);
00037   bool compute(vcl_vector<HomgPoint2D>& p1, vcl_vector<HomgPoint2D>& p2, FMatrix* F)
00038     { return FMatrixCompute::compute(p1,p2,F); }
00039   bool compute(vcl_vector<vgl_homg_point_2d<double> >& p1,
00040                vcl_vector<vgl_homg_point_2d<double> >& p2,
00041                FMatrix& F)
00042     { return FMatrixCompute::compute(p1,p2,F); }
00043 
00044   inline FMatrix compute(PairMatchSetCorner& p) { return FMatrixCompute::compute(p); }
00045   inline FMatrix compute(vcl_vector<HomgPoint2D>& p1, vcl_vector<HomgPoint2D>& p2)
00046     { return FMatrixCompute::compute(p1,p2); }
00047   inline FMatrix compute(vcl_vector<vgl_homg_point_2d<double> >& p1,
00048                          vcl_vector<vgl_homg_point_2d<double> >& p2)
00049     { return FMatrixCompute::compute(p1,p2); }
00050 
00051   
00052 
00053   vcl_vector<int> get_basis() const { return basis_; }
00054   HomgPoint2D get_epipole1() const { return epipole1_; }
00055   HomgPoint2D get_epipole2() const { return epipole2_; }
00056   vcl_vector<double> get_residuals() const { return residuals_; }
00057   vcl_vector<bool> get_inliers() const { return inliers_; }
00058 
00059   
00060   virtual double calculate_term(vcl_vector<double>& residuals, vcl_vector<bool>& inlier_list, int& count);
00061   virtual double calculate_residual(HomgPoint2D& one, HomgPoint2D& two, FMatrix* F);
00062   virtual double calculate_residual(vgl_homg_point_2d<double>& one,
00063                                     vgl_homg_point_2d<double>& two, FMatrix* F);
00064   vcl_vector<double> calculate_residuals(vcl_vector<HomgPoint2D>& one, vcl_vector<HomgPoint2D>& two, FMatrix* F);
00065   vcl_vector<double> calculate_residuals(vcl_vector<vgl_homg_point_2d<double> >& one,
00066                                          vcl_vector<vgl_homg_point_2d<double> >& two,
00067                                          FMatrix* F);
00068   double stdev(vcl_vector<double>& residuals);
00069  protected:
00070   bool rank2_truncate_;
00071   double inthresh_;
00072   double std_;
00073  private:
00074   int row_;
00075   int col_;
00076   vcl_vector<int> basis_;
00077   HomgPoint2D epipole1_;
00078   HomgPoint2D epipole2_;
00079   int data_size_;
00080   vcl_vector<double> residuals_;
00081   vcl_vector<bool> inliers_;
00082 };
00083 
00084 #endif // FMatrixComputeRobust_h_