Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "QmitkVersorRigid3DTransformView.h"
00019 #include "mitkImageAccessByItk.h"
00020 #include <itkVersorRigid3DTransform.h>
00021 #include <itkCenteredTransformInitializer.h>
00022 #include <QValidator>
00023
00024 QmitkVersorRigid3DTransformView::QmitkVersorRigid3DTransformView(QWidget* parent, Qt::WindowFlags f ) : QmitkRigidRegistrationTransformsGUIBase(parent, f),
00025 m_CenterX(0), m_CenterY(0), m_CenterZ(0)
00026 {
00027 }
00028
00029 QmitkVersorRigid3DTransformView::~QmitkVersorRigid3DTransformView()
00030 {
00031 }
00032
00033 itk::Object::Pointer QmitkVersorRigid3DTransformView::GetTransform()
00034 {
00035 if (m_FixedImage.IsNotNull())
00036 {
00037 AccessByItk(m_FixedImage, GetTransform2);
00038 return m_TransformObject;
00039 }
00040 return NULL;
00041 }
00042
00043 template < class TPixelType, unsigned int VImageDimension >
00044 itk::Object::Pointer QmitkVersorRigid3DTransformView::GetTransform2(itk::Image<TPixelType, VImageDimension>* )
00045 {
00046 if (VImageDimension == 3)
00047 {
00048 typedef typename itk::Image< TPixelType, 3 > FixedImage3DType;
00049 typedef typename itk::Image< TPixelType, 3 > MovingImage3DType;
00050 typename FixedImage3DType::Pointer fixedImage3D;
00051 mitk::CastToItkImage(m_FixedImage, fixedImage3D);
00052 typename MovingImage3DType::Pointer movingImage3D;
00053 mitk::CastToItkImage(m_MovingImage, movingImage3D);
00054 typename itk::VersorRigid3DTransform< double >::Pointer transformPointer = itk::VersorRigid3DTransform< double >::New();
00055 transformPointer->SetIdentity();
00056 typedef typename itk::VersorRigid3DTransform< double > VersorRigid3DTransformType;
00057 if (m_Controls.m_CenterForInitializerVersorRigid3D->isChecked())
00058 {
00059 typedef typename itk::CenteredTransformInitializer<VersorRigid3DTransformType, FixedImage3DType, MovingImage3DType> TransformInitializerType;
00060 typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New();
00061 transformInitializer->SetFixedImage( fixedImage3D );
00062 transformInitializer->SetMovingImage( movingImage3D );
00063 transformInitializer->SetTransform( transformPointer );
00064 if (m_Controls.m_MomentsVersorRigid3D->isChecked())
00065 {
00066 transformInitializer->MomentsOn();
00067 }
00068 else
00069 {
00070 transformInitializer->GeometryOn();
00071 }
00072 transformInitializer->InitializeTransform();
00073 }
00074 typedef VersorRigid3DTransformType::VersorType VersorType;
00075 typedef VersorType::VectorType VectorType;
00076
00077 VersorType rotation;
00078 VectorType axis;
00079
00080 axis[0] = 0.0;
00081 axis[1] = 0.0;
00082 axis[2] = 1.0;
00083
00084 const double angle = 0;
00085
00086 rotation.Set( axis, angle );
00087
00088 transformPointer->SetRotation( rotation );
00089 m_CenterX = transformPointer->GetCenter()[0];
00090 m_CenterY = transformPointer->GetCenter()[1];
00091 m_CenterZ = transformPointer->GetCenter()[2];
00092 m_TransformObject = transformPointer.GetPointer();
00093 return transformPointer.GetPointer();
00094 }
00095 return NULL;
00096 }
00097
00098 itk::Array<double> QmitkVersorRigid3DTransformView::GetTransformParameters()
00099 {
00100 itk::Array<double> transformValues;
00101 transformValues.SetSize(9);
00102 transformValues.fill(0);
00103 transformValues[0] = m_Controls.m_UseOptimizerScalesVersorRigid3D->isChecked();
00104 transformValues[1] = m_Controls.m_ScalesVersorRigid3DTransformScale1->text().toDouble();
00105 transformValues[2] = m_Controls.m_ScalesVersorRigid3DTransformScale2->text().toDouble();
00106 transformValues[3] = m_Controls.m_ScalesVersorRigid3DTransformScale3->text().toDouble();
00107 transformValues[4] = m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationX->text().toDouble();
00108 transformValues[5] = m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationY->text().toDouble();
00109 transformValues[6] = m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationZ->text().toDouble();
00110 transformValues[7] = m_Controls.m_CenterForInitializerVersorRigid3D->isChecked();
00111 transformValues[8] = m_Controls.m_MomentsVersorRigid3D->isChecked();
00112 return transformValues;
00113 }
00114
00115 void QmitkVersorRigid3DTransformView::SetTransformParameters(itk::Array<double> transformValues)
00116 {
00117 m_Controls.m_UseOptimizerScalesVersorRigid3D->setChecked(transformValues[0]);
00118 m_Controls.m_ScalesVersorRigid3DTransformScale1->setText(QString::number(transformValues[1]));
00119 m_Controls.m_ScalesVersorRigid3DTransformScale2->setText(QString::number(transformValues[2]));
00120 m_Controls.m_ScalesVersorRigid3DTransformScale3->setText(QString::number(transformValues[3]));
00121 m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationX->setText(QString::number(transformValues[4]));
00122 m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationY->setText(QString::number(transformValues[5]));
00123 m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationZ->setText(QString::number(transformValues[6]));
00124 m_Controls.m_CenterForInitializerVersorRigid3D->setChecked(transformValues[7]);
00125 m_Controls.m_MomentsVersorRigid3D->setChecked(transformValues[8]);
00126 m_Controls.m_GeometryVersorRigid3D->setChecked(!transformValues[8]);
00127 }
00128
00129 QString QmitkVersorRigid3DTransformView::GetName()
00130 {
00131 return "VersorRigid3D";
00132 }
00133
00134 void QmitkVersorRigid3DTransformView::SetupUI(QWidget* parent)
00135 {
00136 m_Controls.setupUi(parent);
00137 QValidator* validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this);
00138 m_Controls.m_ScalesVersorRigid3DTransformScale1->setValidator(validatorLineEditInputFloat);
00139 m_Controls.m_ScalesVersorRigid3DTransformScale2->setValidator(validatorLineEditInputFloat);
00140 m_Controls.m_ScalesVersorRigid3DTransformScale3->setValidator(validatorLineEditInputFloat);
00141 m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationX->setValidator(validatorLineEditInputFloat);
00142 m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationY->setValidator(validatorLineEditInputFloat);
00143 m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationZ->setValidator(validatorLineEditInputFloat);
00144 }
00145
00146 itk::Array<double> QmitkVersorRigid3DTransformView::GetScales()
00147 {
00148 itk::Array<double> scales;
00149 scales.SetSize(6);
00150 scales.Fill(1.0);
00151 if (m_Controls.m_UseOptimizerScalesVersorRigid3D->isChecked())
00152 {
00153 scales[0] = m_Controls.m_ScalesVersorRigid3DTransformScale1->text().toDouble();
00154 scales[1] = m_Controls.m_ScalesVersorRigid3DTransformScale2->text().toDouble();
00155 scales[2] = m_Controls.m_ScalesVersorRigid3DTransformScale3->text().toDouble();
00156 scales[3] = m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationX->text().toDouble();
00157 scales[4] = m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationY->text().toDouble();
00158 scales[5] = m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationZ->text().toDouble();
00159 }
00160 return scales;
00161 }
00162
00163 vtkTransform* QmitkVersorRigid3DTransformView::Transform(vtkMatrix4x4* vtkmatrix, vtkTransform* vtktransform, itk::Array<double> transformParams)
00164 {
00165 if (m_MovingImage.IsNotNull())
00166 {
00167 itk::VersorRigid3DTransform<double>::Pointer versorTransform = itk::VersorRigid3DTransform<double>::New();
00168 versorTransform->SetParameters(transformParams);
00169 itk::Matrix<double, 3, 3> Matrix = versorTransform->GetMatrix();
00170 for (int i = 0; i < 3; i++)
00171 {
00172 for (int j = 0; j < 3; j++)
00173 {
00174 vtkmatrix->SetElement(i, j, Matrix[i][j]);
00175 }
00176 }
00177 float center[4];
00178 float translation[4];
00179 center[0] = m_CenterX;
00180 center[1] = m_CenterY;
00181 center[2] = m_CenterZ;
00182 center[3] = 1;
00183 vtkmatrix->MultiplyPoint(center, translation);
00184 vtkmatrix->SetElement(0, 3, -translation[0] + center[0] + transformParams[3]);
00185 vtkmatrix->SetElement(1, 3, -translation[1] + center[1] + transformParams[4]);
00186 vtkmatrix->SetElement(2, 3, -translation[2] + center[2] + transformParams[5]);
00187 vtktransform->SetMatrix(vtkmatrix);
00188 }
00189 return vtktransform;
00190 }
00191
00192 int QmitkVersorRigid3DTransformView::GetNumberOfTransformParameters()
00193 {
00194 if (m_FixedImage.IsNotNull())
00195 {
00196 if (m_FixedImage->GetDimension() == 2)
00197 return 0;
00198 else
00199 return 6;
00200 }
00201 else
00202 return 0;
00203 }