27 #include "../common/MatrixUtils.h" 
   44   static std::string name( 
"Affine" );
 
   55                                   const double& pt1Y, 
double& pt2X, 
double& pt2Y )
 const 
   57   assert( isValid( params ) );
 
   68                                    const double& pt2Y, 
double& pt1X, 
double& pt1Y )
 const 
   70   assert( isValid( params ) );
 
   94   m_computeParameters_tiepointsSize = 
static_cast<unsigned int>(params.
m_tiePoints.size());
 
   96   if( m_computeParameters_tiepointsSize < getMinRequiredTiePoints() )
 
   99   m_computeParameters_L.resize( 2*m_computeParameters_tiepointsSize, 1 );
 
  100   m_computeParameters_A.resize( 2*m_computeParameters_tiepointsSize, 6 );
 
  101   m_computeParameters_index1 = 0;
 
  102   m_computeParameters_index2 = 0;
 
  104   for ( m_computeParameters_tpIdx = 0 ; m_computeParameters_tpIdx < m_computeParameters_tiepointsSize ; ++m_computeParameters_tpIdx)
 
  109     m_computeParameters_index1 = m_computeParameters_tpIdx*2;
 
  110     m_computeParameters_index2 = m_computeParameters_index1 + 1;
 
  112     m_computeParameters_A( m_computeParameters_index1, 0 ) = x_y.
x ;
 
  113     m_computeParameters_A( m_computeParameters_index1, 1 ) = x_y.
y ;
 
  114     m_computeParameters_A( m_computeParameters_index1, 2 ) = 1 ;
 
  115     m_computeParameters_A( m_computeParameters_index1, 3 ) = 0 ;
 
  116     m_computeParameters_A( m_computeParameters_index1, 4 ) = 0 ;
 
  117     m_computeParameters_A( m_computeParameters_index1, 5 ) = 0 ;
 
  119     m_computeParameters_A( m_computeParameters_index2, 0 ) = 0 ;
 
  120     m_computeParameters_A( m_computeParameters_index2, 1 ) = 0 ;
 
  121     m_computeParameters_A( m_computeParameters_index2, 2 ) = 0 ;
 
  122     m_computeParameters_A( m_computeParameters_index2, 3 ) = x_y.
x ;
 
  123     m_computeParameters_A( m_computeParameters_index2, 4 ) = x_y.
y ;
 
  124     m_computeParameters_A( m_computeParameters_index2, 5 ) = 1 ; 
 
  126     m_computeParameters_L( m_computeParameters_index1, 0) = u_v.
x;
 
  127     m_computeParameters_L( m_computeParameters_index2, 0) = u_v.
y;
 
  131   m_computeParameters_At = boost::numeric::ublas::trans( m_computeParameters_A );
 
  134   m_computeParameters_N = boost::numeric::ublas::prod( m_computeParameters_At, m_computeParameters_A );
 
  137   m_computeParameters_U = boost::numeric::ublas::prod( m_computeParameters_At, m_computeParameters_L );
 
  145     m_computeParameters_X = boost::numeric::ublas::prod( m_computeParameters_N_inv, 
 
  146       m_computeParameters_U );
 
  158     m_computeParameters_XExpanded.resize( 3, 3 );
 
  159     m_computeParameters_XExpanded( 0, 0 ) = m_computeParameters_X(0,0);
 
  160     m_computeParameters_XExpanded( 0, 1 ) = m_computeParameters_X(1,0);
 
  161     m_computeParameters_XExpanded( 0, 2 ) = m_computeParameters_X(2,0);
 
  162     m_computeParameters_XExpanded( 1, 0 ) = m_computeParameters_X(3,0);
 
  163     m_computeParameters_XExpanded( 1, 1 ) = m_computeParameters_X(4,0);
 
  164     m_computeParameters_XExpanded( 1, 2 ) = m_computeParameters_X(5,0);
 
  165     m_computeParameters_XExpanded( 2, 0 ) = 0;
 
  166     m_computeParameters_XExpanded( 2, 1 ) = 0;
 
  167     m_computeParameters_XExpanded( 2, 2 ) = 1;
 
  194                                   double& translationX, 
double& translationY,
 
  195                                   double& scalingFactorX, 
double& scalingFactorY, 
double& skew,
 
  196                                   double& squeeze, 
double& scaling, 
double& rotation )
 
  198   assert( transfParams.size() == 6 );
 
  200   double APar = transfParams[ 0 ];
 
  201   double BPar = transfParams[ 1 ];
 
  202   double CPar = transfParams[ 3 ];
 
  203   double DPar = transfParams[ 4 ];
 
  205   double determinant = ( APar * DPar ) - ( BPar * CPar );
 
  207   if( determinant == 0.0 )
 
  211   else if( determinant < 0.0 )
 
  213     APar = transfParams[ 1 ];
 
  214     BPar = transfParams[ 0 ];
 
  215     CPar = transfParams[ 4 ];
 
  216     DPar = transfParams[ 3 ];
 
  218     determinant = ( APar * DPar ) - ( BPar * CPar );
 
  220     const double FVar = 1.0 / ( ( APar * APar ) +
 
  223     skew = ( ( APar * BPar ) + ( CPar * DPar ) ) * FVar;
 
  225     squeeze = 1.0 / sqrt( FVar * determinant );
 
  227     scaling = sqrt( determinant );
 
  229     scalingFactorX = scaling / squeeze;
 
  231     scalingFactorY = scaling * squeeze;    
 
  233     rotation = atan( APar / CPar );
 
  237     const double FVar = 1.0 / ( ( APar * APar ) +
 
  240     skew = ( ( APar * BPar ) + ( CPar * DPar ) ) * FVar;
 
  242     squeeze = 1.0 / sqrt( FVar * determinant );
 
  244     scaling = sqrt( determinant );
 
  246     scalingFactorX = scaling * squeeze;
 
  248     scalingFactorY = scaling / squeeze;    
 
  250     rotation = atan( CPar / APar );
 
  253   translationX = transfParams[ 2 ];
 
  255   translationY = transfParams[ 5 ];
 
std::vector< TiePoint > m_tiePoints
Tie points. 
 
void directMap(const GTParameters ¶ms, const double &pt1X, const double &pt1Y, double &pt2X, double &pt2Y) const 
Direct mapping (from pt1 space into pt2 space). 
 
std::vector< double > m_directParameters
Transformation numeric direct parameters. 
 
AffineGT()
Default constructor. 
 
An utility struct for representing 2D coordinates. 
 
2D Affine Geometric transformation. 
 
const std::string & getName() const 
Returns the current transformation name. 
 
bool computeParameters(GTParameters ¶ms) const 
Calculate the transformation parameters following the new supplied tie-points. 
 
static bool decompose(const std::vector< double > &transfParams, double &translationX, double &translationY, double &scalingFactorX, double &scalingFactorY, double &skew, double &squeeze, double &scaling, double &rotation)
Returns the basic set of transform parameters given by the decomposition of a given affine transforma...
 
void inverseMap(const GTParameters ¶ms, const double &pt2X, const double &pt2Y, double &pt1X, double &pt1Y) const 
Inverse mapping (from pt2 space into pt1 space). 
 
bool GetInverseMatrix(const boost::numeric::ublas::matrix< T > &inputMatrix, boost::numeric::ublas::matrix< T > &outputMatrix)
Matrix inversion. 
 
std::vector< double > m_inverseParameters
Transformation numeric inverse parameters. 
 
2D Geometric transformation parameters. 
 
unsigned int getMinRequiredTiePoints() const 
Returns the minimum number of required tie-points for the current transformation. ...
 
2D Affine Geometric transformation. 
 
GeometricTransformation * clone() const 
Creat a clone copy of this instance.