27 #include "../common/MatrixUtils.h"
43 static std::string name(
"Projective" );
54 const double& pt1Y,
double& pt2X,
double& pt2Y )
const
56 assert( isValid( params ) );
84 const double& pt2Y,
double& pt1X,
double& pt1Y )
const
86 assert( isValid( params ) );
145 m_computeParameters_tiepointsSize = params.
m_tiePoints.size();
146 if( m_computeParameters_tiepointsSize < getMinRequiredTiePoints() )
return false;
149 m_computeParameters_L_DM.resize( 2*m_computeParameters_tiepointsSize, 1 );
150 m_computeParameters_A_DM.resize( 2*m_computeParameters_tiepointsSize, 8 );
153 m_computeParameters_L_IM.resize( 2*m_computeParameters_tiepointsSize, 1 );
154 m_computeParameters_A_IM.resize( 2*m_computeParameters_tiepointsSize, 8 );
156 for ( m_computeParameters_blockOffset = 0 ; (m_computeParameters_blockOffset < m_computeParameters_tiepointsSize) ;
157 ++m_computeParameters_blockOffset)
159 m_computeParameters_index1 = m_computeParameters_blockOffset*2;
160 m_computeParameters_index2 = m_computeParameters_index1 + 1;
165 m_computeParameters_L_DM( m_computeParameters_index1, 0) = u_v.
x;
166 m_computeParameters_L_DM( m_computeParameters_index2, 0) = u_v.
y;
168 m_computeParameters_A_DM( m_computeParameters_index1, 0 ) = x_y.
x ;
169 m_computeParameters_A_DM( m_computeParameters_index1, 1 ) = x_y.
y ;
170 m_computeParameters_A_DM( m_computeParameters_index1, 2 ) = 1 ;
171 m_computeParameters_A_DM( m_computeParameters_index1, 3 ) = 0 ;
172 m_computeParameters_A_DM( m_computeParameters_index1, 4 ) = 0 ;
173 m_computeParameters_A_DM( m_computeParameters_index1, 5 ) = 0 ;
174 m_computeParameters_A_DM( m_computeParameters_index1, 6 ) = - x_y.
x * u_v.
x;
175 m_computeParameters_A_DM( m_computeParameters_index1, 7 ) = - x_y.
y * u_v.
x;
177 m_computeParameters_A_DM( m_computeParameters_index2, 0 ) = 0;
178 m_computeParameters_A_DM( m_computeParameters_index2, 1 ) = 0;
179 m_computeParameters_A_DM( m_computeParameters_index2, 2 ) = 0;
180 m_computeParameters_A_DM( m_computeParameters_index2, 3 ) = x_y.
x ;
181 m_computeParameters_A_DM( m_computeParameters_index2, 4 ) = x_y.
y ;
182 m_computeParameters_A_DM( m_computeParameters_index2, 5 ) = 1 ;
183 m_computeParameters_A_DM( m_computeParameters_index2, 6 ) = - x_y.
x * u_v.
y;
184 m_computeParameters_A_DM( m_computeParameters_index2, 7 ) = - x_y.
y * u_v.
y;
186 m_computeParameters_L_IM( m_computeParameters_index1, 0) = x_y.
x;
187 m_computeParameters_L_IM( m_computeParameters_index2, 0) = x_y.
y;
189 m_computeParameters_A_IM( m_computeParameters_index1, 0 ) = u_v.
x ;
190 m_computeParameters_A_IM( m_computeParameters_index1, 1 ) = u_v.
y ;
191 m_computeParameters_A_IM( m_computeParameters_index1, 2 ) = 1 ;
192 m_computeParameters_A_IM( m_computeParameters_index1, 3 ) = 0 ;
193 m_computeParameters_A_IM( m_computeParameters_index1, 4 ) = 0 ;
194 m_computeParameters_A_IM( m_computeParameters_index1, 5 ) = 0 ;
195 m_computeParameters_A_IM( m_computeParameters_index1, 6 ) = - u_v.
x * x_y.
x;
196 m_computeParameters_A_IM( m_computeParameters_index1, 7 ) = - u_v.
y * x_y.
x;
198 m_computeParameters_A_IM( m_computeParameters_index2, 0 ) = 0;
199 m_computeParameters_A_IM( m_computeParameters_index2, 1 ) = 0;
200 m_computeParameters_A_IM( m_computeParameters_index2, 2 ) = 0;
201 m_computeParameters_A_IM( m_computeParameters_index2, 3 ) = u_v.
x ;
202 m_computeParameters_A_IM( m_computeParameters_index2, 4 ) = u_v.
y ;
203 m_computeParameters_A_IM( m_computeParameters_index2, 5 ) = 1 ;
204 m_computeParameters_A_IM( m_computeParameters_index2, 6 ) = - u_v.
x * x_y.
y;
205 m_computeParameters_A_IM( m_computeParameters_index2, 7 ) = - u_v.
y * x_y.
y;
209 m_computeParameters_A_DM_t = boost::numeric::ublas::trans( m_computeParameters_A_DM );
210 m_computeParameters_A_IM_t = boost::numeric::ublas::trans( m_computeParameters_A_IM );
213 m_computeParameters_N_DM = boost::numeric::ublas::prod( m_computeParameters_A_DM_t, m_computeParameters_A_DM );
214 m_computeParameters_N_IM = boost::numeric::ublas::prod( m_computeParameters_A_IM_t, m_computeParameters_A_IM );
217 m_computeParameters_U_DM = boost::numeric::ublas::prod( m_computeParameters_A_DM_t, m_computeParameters_L_DM );
218 m_computeParameters_U_IM = boost::numeric::ublas::prod( m_computeParameters_A_IM_t, m_computeParameters_L_IM );
224 m_computeParameters_X_DM = boost::numeric::ublas::prod( m_computeParameters_N_DM_inv, m_computeParameters_U_DM );
238 m_computeParameters_X_IM = boost::numeric::ublas::prod( m_computeParameters_N_IM_inv, m_computeParameters_U_IM );
ProjectiveGT()
Default constructor.
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.
An utility struct for representing 2D coordinates.
2D Projective Geometric transformation.
const std::string & getName() const
Returns the current transformation name.
void inverseMap(const GTParameters ¶ms, const double &pt2X, const double &pt2Y, double &pt1X, double &pt1Y) const
Inverse mapping (from pt2 space into pt1 space).
GeometricTransformation * clone() const
Creat a clone copy of this instance.
2D Projective Geometric transformation.
bool computeParameters(GTParameters ¶ms) const
Calculate the transformation parameters following the new supplied tie-points.
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. ...
~ProjectiveGT()
Destructor.