zxhproj v 2.2
zxhproj
|
00001 00002 /*========================================================================= 00003 00004 Program: ZXH Registration Software 00005 Author: Xiahai Zhuang 00006 Module: $RCSfle: zxhTransformAffine.h $ 00007 Language: C++ 00008 Date: $Date: From 2004-01 $ 00009 Version: $Revision: 1.0, 2.0 $ 00010 00011 Update log: 8th April 2007 add skew angle xy yx yz zy zx xz for 3D transformation, 00012 2011-03-20 checked 00013 Y = Mskew x {Mscale x Mrotate x (X-Center) + Translate + Center} = K x {S x R x (X-C) + L + C} 00014 00015 =========================================================================*/ 00016 00017 #ifndef zxhTransformAffine_h 00018 #define zxhTransformAffine_h 00019 00045 00046 #include "zxhTransformBase.h" 00047 #include "zxhGradientBase.h" 00048 #include "zxhImageData.h" 00049 #include <string> 00050 00051 class zxhTransformAffine : public zxhTransformBase, public zxhGradientBase 00052 { 00053 /*zxhushort m_iDimension; 00054 zxhImageData* m_pImageTest; 00055 zxhImageData* m_pImageRef;*/ 00056 public: 00058 zxhTransformAffine(); 00060 virtual ~zxhTransformAffine(); 00061 00063 virtual bool SetTransformFromFile(const char* pFile); 00065 virtual bool SetTransformFromStream(std::ifstream& ifs); 00067 virtual bool SetTransformIdentity(); 00070 virtual bool SetTransformAlignByCentre(int iCentre); 00072 virtual bool SetTransformAlignByCentre(std::string sCentre) 00073 { 00074 if(strcmp(sCentre.c_str(),"centre")==0) return SetTransformAlignByCentre(2); 00075 if(strcmp(sCentre.c_str(),"gcentre")==0) return SetTransformAlignByCentre(3); 00076 return false; 00077 } 00078 00080 virtual std::string GetPrintString(); 00081 00083 virtual std::string GetTransformType(){return "AFF";} 00084 00086 virtual zxhTransformBase* Clone(zxhTransformBase*&pRet); 00087 00089 float * GetRotation() {std::cerr<<"warning: unsafe access Affine parameters because of no automatic updatematrix, please use GetRotationValue\n";return m_afRotate;} 00091 float * GetCenter() {std::cerr<<"warning: unsafe access Affine parameters because of no automatic updatematrix, please use GetCenterValue\n";return m_afCenter;} 00093 float * GetScaling() {std::cerr<<"warning: unsafe access Affine parameters because of no automatic updatematrix, please use GetScalingValue\n";return m_afScaling;} 00095 float * GetTranslation() {std::cerr<<"warning: unsafe access Affine parameters because of no automatic updatematrix, please use GetTranslationValue\n";return m_afTranslate;} 00097 float * GetSkewxy() {std::cerr<<"warning: unsafe access Affine parameters because of no automatic updatematrix, please use GetSkewValue\n";return m_afSkewxy;}; 00099 float * GetSkewyz() {std::cerr<<"warning: unsafe access Affine parameters because of no automatic updatematrix, please use GetSkewValue\n";return m_afSkewyz;}; 00101 float * GetSkewzx() {std::cerr<<"warning: unsafe access Affine parameters because of no automatic updatematrix, please use GetSkewValue\n";return m_afSkewzx;}; 00103 void GetRotationValue( float rotation[ImageDimensionMax] ); 00105 void GetCenterValue( float center[ImageDimensionMax] ); 00107 void GetTranslationValue( float tranlsation[ImageDimensionMax] ); 00109 void GetScalingValue( float scaling[ImageDimensionMax] ); 00111 void GetSkewValue( float skewxy[2], float skewyz[2], float skewxz[2] ); 00113 void SetRotation(float afRotate[ImageDimensionMax]); 00115 void SetCenter(float afCenter[ImageDimensionMax]); 00117 void SetScaling(float afScaling[ImageDimensionMax]); 00119 void SetTranslation(float afTranslate[ImageDimensionMax]); 00121 void SetSkewxy(float afSkewxy[2]); 00123 void SetSkewyz(float afSkewyz[2]); 00125 void SetSkewzx(float afSkewzx[2]); 00126 00128 virtual void TransformWorldToWorld(const float fVectorFromWorld[ImageDimensionMax],float fVectorToWorld[ImageDimensionMax]); 00130 virtual void InverseTransformWorld(float fVectorToWorld[ImageDimensionMax],float fVectorFromWorld[ImageDimensionMax]); 00131 00133 virtual bool GetJacobianMatrixWorld(float fWorld[ImageDimensionMax],float pJacobian[ImageDimensionMax*ImageDimensionMax]) ; 00135 virtual bool GetJacobianMatrix(float fVector[ImageDimensionMax],float pJacobian[ImageDimensionMax*ImageDimensionMax]) 00136 {return GetJacobianMatrixWorld(fVector, pJacobian);}; 00138 virtual zxhTransformAffine & operator = (const zxhTransformAffine b); 00140 virtual bool SetTransformPara(float f); 00142 virtual bool GetAdd(zxhTransformBase*,zxhTransformBase*); 00144 virtual bool Add(zxhTransformBase*) ; 00146 virtual bool GetSubtract(zxhTransformBase*,zxhTransformBase*) ; 00148 virtual bool Subtract(zxhTransformBase*) ; 00150 virtual bool GetMultiply(zxhTransformBase*,float); 00152 virtual bool Multiply(float) ; 00154 virtual bool GetMultiplyByPara(zxhTransformBase*,zxhTransformBase*) ; 00156 virtual bool MultiplyByPara(zxhTransformBase*) ; 00158 virtual bool GetCompareByPara(zxhTransformBase*,float f=0) ; 00160 virtual bool CompareByPara(float f=0) ; 00161 00163 virtual float GetMagnitudeAsVector(void); 00165 virtual float GetMaxAbsValueFromParameters(void) ; 00167 virtual float GetPointMutiplyAsVector(zxhTransformBase*); 00168 00171 virtual void UpdateMatrix(); 00173 virtual void UpdateInvertMatrix(); 00175 virtual int GetNoParameters() {return 22;}; 00179 virtual bool SetParameterValue( int index, float f ) ; 00181 virtual float GetParameters(int index) ; 00183 virtual int GetDegreeOfFreedom () ; 00185 virtual int GetDOFWithValue( float f ) ; 00187 virtual float GetMaxLocalMagnitudeAndNormalisation( bool bNormalisationByLocalMagnitude); 00189 virtual bool AdvanceStep(zxhTransformBase*p, float f=1) ; 00191 virtual float * GetMatrixPointer() { return &m_afMatrix[0][0] ; } ; 00193 virtual float * GetInvertMatrixPointer() { return &m_afInvertMatrix[0][0]; }; 00194 00195 protected: 00196 // m_bScalingFirst=true, then scaling,rotate by center,translate 00197 //bool m_bScalingFirst; 00198 00200 float m_afRotate[ImageDimensionMax]; 00202 float m_afTranslate[ImageDimensionMax]; 00204 float m_afCenter[ImageDimensionMax]; 00206 float m_afScaling[ImageDimensionMax]; 00210 float m_afSkewxy[2]; 00213 float m_afSkewyz[2]; 00216 float m_afSkewzx[2]; 00218 float m_afMatrix[4][4]; 00220 float m_afInvertMatrix[4][4]; 00221 00222 00224 00225 public: 00229 virtual bool ComputeMetricGradient 00230 ( 00231 zxhMetricBase*pMetric, 00232 zxhTransformBase*pInfluence=0 00233 ); 00241 00242 virtual void InitialGradientDifferentialStep(zxhTransformAffine*pGrad, 00243 float TranslateScale, float RotateScale, float ScalingScale, float factor=1); 00245 virtual void InitialGradientDifferentialStep(zxhTransformAffine*pGrad, 00246 float TranslateScale[], float RotateScale[], float ScalingScale[], 00247 float SkewScale, float factor=1); 00248 /* 00249 virtual void SetUnitGradientOptimisation( bool b = true ) { m_bUnitGradient = b ; } ; 00251 virtual bool GetUnitGradientOptimisation() { return m_bUnitGradient ; } ; 00253 virtual float GetEstimateSubjectSize() { return m_fEstimateSubjectSize;}; 00255 virtual void SetEstimateSubjectSize(float f) { m_fEstimateSubjectSize = f;}; 00257 virtual float GetMaxDisplacementOfSubject() ; 00260 //bool m_bUnitGradient ; 00262 //float m_fEstimateSubjectSize ;*/ 00263 }; 00264 00265 #endif