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 "QmitkQuaternionRigidTransformView.h"
00019 #include "mitkImageAccessByItk.h"
00020 #include <itkQuaternionRigidTransform.h>
00021 #include <itkCenteredTransformInitializer.h>
00022 #include <QValidator>
00023
00024 QmitkQuaternionRigidTransformView::QmitkQuaternionRigidTransformView(QWidget* parent, Qt::WindowFlags f ) : QmitkRigidRegistrationTransformsGUIBase(parent, f),
00025 m_CenterX(0), m_CenterY(0), m_CenterZ(0)
00026 {
00027 }
00028
00029 QmitkQuaternionRigidTransformView::~QmitkQuaternionRigidTransformView()
00030 {
00031 }
00032
00033 itk::Object::Pointer QmitkQuaternionRigidTransformView::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 QmitkQuaternionRigidTransformView::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::QuaternionRigidTransform< double >::Pointer transformPointer = itk::QuaternionRigidTransform< double >::New();
00055 transformPointer->SetIdentity();
00056 typedef typename itk::QuaternionRigidTransform< double > QuaternionRigidTransformType;
00057 if (m_Controls.m_CenterForInitializerQuaternionRigid->isChecked())
00058 {
00059 typedef typename itk::CenteredTransformInitializer<QuaternionRigidTransformType, 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_MomentsQuaternionRigid->isChecked())
00065 {
00066 transformInitializer->MomentsOn();
00067 }
00068 else
00069 {
00070 transformInitializer->GeometryOn();
00071 }
00072 transformInitializer->InitializeTransform();
00073 }
00074 m_CenterX = transformPointer->GetCenter()[0];
00075 m_CenterY = transformPointer->GetCenter()[1];
00076 m_CenterZ = transformPointer->GetCenter()[2];
00077 m_TransformObject = transformPointer.GetPointer();
00078 return transformPointer.GetPointer();
00079 }
00080 return NULL;
00081 }
00082
00083 itk::Array<double> QmitkQuaternionRigidTransformView::GetTransformParameters()
00084 {
00085 itk::Array<double> transformValues;
00086 transformValues.SetSize(10);
00087 transformValues.fill(0);
00088 transformValues[0] = m_Controls.m_UseOptimizerScalesQuaternionRigid->isChecked();
00089 transformValues[1] = m_Controls.m_ScalesQuaternionRigidTransformScale1->text().toDouble();
00090 transformValues[2] = m_Controls.m_ScalesQuaternionRigidTransformScale2->text().toDouble();
00091 transformValues[3] = m_Controls.m_ScalesQuaternionRigidTransformScale3->text().toDouble();
00092 transformValues[4] = m_Controls.m_ScalesQuaternionRigidTransformScale4->text().toDouble();
00093 transformValues[5] = m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationX->text().toDouble();
00094 transformValues[6] = m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationY->text().toDouble();
00095 transformValues[7] = m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationZ->text().toDouble();
00096 transformValues[8] = m_Controls.m_CenterForInitializerQuaternionRigid->isChecked();
00097 transformValues[9] = m_Controls.m_MomentsQuaternionRigid->isChecked();
00098 return transformValues;
00099 }
00100
00101 void QmitkQuaternionRigidTransformView::SetTransformParameters(itk::Array<double> transformValues)
00102 {
00103 m_Controls.m_UseOptimizerScalesQuaternionRigid->setChecked(transformValues[0]);
00104 m_Controls.m_ScalesQuaternionRigidTransformScale1->setText(QString::number(transformValues[1]));
00105 m_Controls.m_ScalesQuaternionRigidTransformScale2->setText(QString::number(transformValues[2]));
00106 m_Controls.m_ScalesQuaternionRigidTransformScale3->setText(QString::number(transformValues[3]));
00107 m_Controls.m_ScalesQuaternionRigidTransformScale4->setText(QString::number(transformValues[4]));
00108 m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationX->setText(QString::number(transformValues[5]));
00109 m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationY->setText(QString::number(transformValues[6]));
00110 m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationZ->setText(QString::number(transformValues[7]));
00111 m_Controls.m_CenterForInitializerQuaternionRigid->setChecked(transformValues[8]);
00112 m_Controls.m_MomentsQuaternionRigid->setChecked(transformValues[9]);
00113 m_Controls.m_GeometryQuaternionRigid->setChecked(!transformValues[9]);
00114 }
00115
00116 QString QmitkQuaternionRigidTransformView::GetName()
00117 {
00118 return "QuaternionRigid";
00119 }
00120
00121 void QmitkQuaternionRigidTransformView::SetupUI(QWidget* parent)
00122 {
00123 m_Controls.setupUi(parent);
00124 QValidator* validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this);
00125 m_Controls.m_ScalesQuaternionRigidTransformScale1->setValidator(validatorLineEditInputFloat);
00126 m_Controls.m_ScalesQuaternionRigidTransformScale2->setValidator(validatorLineEditInputFloat);
00127 m_Controls.m_ScalesQuaternionRigidTransformScale3->setValidator(validatorLineEditInputFloat);
00128 m_Controls.m_ScalesQuaternionRigidTransformScale4->setValidator(validatorLineEditInputFloat);
00129 m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationX->setValidator(validatorLineEditInputFloat);
00130 m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationY->setValidator(validatorLineEditInputFloat);
00131 m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationZ->setValidator(validatorLineEditInputFloat);
00132 }
00133
00134 itk::Array<double> QmitkQuaternionRigidTransformView::GetScales()
00135 {
00136 itk::Array<double> scales;
00137 scales.SetSize(7);
00138 scales.Fill(1.0);
00139 if (m_Controls.m_UseOptimizerScalesQuaternionRigid->isChecked())
00140 {
00141 scales[0] = m_Controls.m_ScalesQuaternionRigidTransformScale1->text().toDouble();
00142 scales[1] = m_Controls.m_ScalesQuaternionRigidTransformScale2->text().toDouble();
00143 scales[2] = m_Controls.m_ScalesQuaternionRigidTransformScale3->text().toDouble();
00144 scales[3] = m_Controls.m_ScalesQuaternionRigidTransformScale4->text().toDouble();
00145 scales[4] = m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationX->text().toDouble();
00146 scales[5] = m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationY->text().toDouble();
00147 scales[6] = m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationZ->text().toDouble();
00148 }
00149 return scales;
00150 }
00151
00152 vtkTransform* QmitkQuaternionRigidTransformView::Transform(vtkMatrix4x4* vtkmatrix, vtkTransform* vtktransform, itk::Array<double> transformParams)
00153 {
00154 if (m_MovingImage.IsNotNull())
00155 {
00156 itk::QuaternionRigidTransform<double>::Pointer quaternionTransform = itk::QuaternionRigidTransform<double>::New();
00157 quaternionTransform->SetParameters(transformParams);
00158 itk::Matrix<double, 3, 3> Matrix = quaternionTransform->GetMatrix();
00159 for (int i = 0; i < 3; i++)
00160 {
00161 for (int j = 0; j < 3; j++)
00162 {
00163 vtkmatrix->SetElement(i, j, Matrix[i][j]);
00164 }
00165 }
00166 float center[4];
00167 float translation[4];
00168 center[0] = m_CenterX;
00169 center[1] = m_CenterY;
00170 center[2] = m_CenterZ;
00171 center[3] = 1;
00172 vtkmatrix->MultiplyPoint(center, translation);
00173 vtkmatrix->SetElement(0, 3, -translation[0] + center[0] + transformParams[4]);
00174 vtkmatrix->SetElement(1, 3, -translation[1] + center[1] + transformParams[5]);
00175 vtkmatrix->SetElement(2, 3, -translation[2] + center[2] + transformParams[6]);
00176 vtktransform->SetMatrix(vtkmatrix);
00177 }
00178 return vtktransform;
00179 }
00180
00181 int QmitkQuaternionRigidTransformView::GetNumberOfTransformParameters()
00182 {
00183 if (m_FixedImage.IsNotNull())
00184 {
00185 if (m_FixedImage->GetDimension() == 2)
00186 return 0;
00187 else
00188 return 7;
00189 }
00190 else
00191 return 0;
00192 }