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.