Go to the documentation of this file.00001 
00002 #ifndef FMPlanarNonLinFun_h_
00003 #define FMPlanarNonLinFun_h_
00004 #ifdef VCL_NEEDS_PRAGMA_INTERFACE
00005 #pragma interface
00006 #endif
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 #include <vcl_vector.h>
00022 #include <vnl/vnl_least_squares_function.h>
00023 #include <vnl/vnl_double_3x3.h>
00024 #include <vgl/vgl_homg_point_2d.h>
00025 #include <mvl/HomgPoint2D.h>
00026 #include <mvl/HomgMetric.h>
00027 #include <mvl/HomgNorm2D.h>
00028 
00029 class FMatrixPlanar;
00030 class ImageMetric;
00031 
00032 class FMPlanarNonLinFun : public vnl_least_squares_function
00033 {
00034   int data_size_;
00035 
00036   vcl_vector<vgl_homg_point_2d<double> > points1_;
00037   vcl_vector<vgl_homg_point_2d<double> > points2_;
00038 
00039   HomgNorm2D normalized_;
00040 
00041   vnl_double_3x3 denorm_matrix_;
00042   vnl_double_3x3 denorm_matrix_inv_;
00043 
00044 #if 0 // unused ?!
00045   double outlier_distance_squared_;
00046   int terminate_count_;
00047 #endif
00048 
00049   HomgMetric image_metric1_;
00050   HomgMetric image_metric2_;
00051 
00052  public:
00053   
00054   
00055   FMPlanarNonLinFun(const ImageMetric*, const ImageMetric*,
00056                     double outlier_distance_squared,
00057                     vcl_vector<vgl_homg_point_2d<double> >& points1,
00058                     vcl_vector<vgl_homg_point_2d<double> >& points2);
00059   FMPlanarNonLinFun(const ImageMetric*, const ImageMetric*,
00060                     double outlier_distance_squared,
00061                     vcl_vector<HomgPoint2D>& points1,
00062                     vcl_vector<HomgPoint2D>& points2);
00063 
00064   bool compute(FMatrixPlanar* F);
00065 
00066   
00067   void f(vnl_vector<double> const& x, vnl_vector<double>& fx);
00068 
00069   
00070  private:
00071   void fmatrix_to_params(const FMatrixPlanar& F, vnl_vector<double>& params);
00072   FMatrixPlanar params_to_fmatrix(const vnl_vector<double>& params);
00073 
00074   void fmatrix_to_params_awf(const FMatrixPlanar& F, vnl_vector<double>& params);
00075   FMatrixPlanar params_to_fmatrix_awf(const vnl_vector<double>& params);
00076 
00077   void fmatrix_to_params_mna(const FMatrixPlanar& F, vnl_vector<double>& params);
00078   FMatrixPlanar params_to_fmatrix_mna(const vnl_vector<double>& params);
00079 };
00080 
00081 #endif // FMPlanarNonLinFun_h_