00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "mitkImageTimeSelector.h"
00019 #include <QValidator>
00020 #include <vtkTransform.h>
00021 #include <vtkMatrix4x4.h>
00022 #include "mitkMatrixConvert.h"
00023 #include <qinputdialog.h>
00024 #include <qmessagebox.h>
00025 #include "QmitkLoadPresetDialog.h"
00026 #include <itkArray.h>
00027 #include "mitkRigidRegistrationPreset.h"
00028 #include "mitkRigidRegistrationTestPreset.h"
00029 #include "mitkProgressBar.h"
00030
00031 #include "QmitkRigidRegistrationSelectorView.h"
00032
00033 #include "QmitkTranslationTransformView.h"
00034 #include "QmitkScaleTransformView.h"
00035 #include "QmitkScaleLogarithmicTransformView.h"
00036 #include "QmitkAffineTransformView.h"
00037 #include "QmitkFixedCenterOfRotationAffineTransformView.h"
00038 #include "QmitkRigid3DTransformView.h"
00039 #include "QmitkEuler3DTransformView.h"
00040 #include "QmitkCenteredEuler3DTransformView.h"
00041 #include "QmitkQuaternionRigidTransformView.h"
00042 #include "QmitkVersorTransformView.h"
00043 #include "QmitkVersorRigid3DTransformView.h"
00044 #include "QmitkScaleSkewVersor3DTransformView.h"
00045 #include "QmitkSimilarity3DTransformView.h"
00046 #include "QmitkRigid2DTransformView.h"
00047 #include "QmitkCenteredRigid2DTransformView.h"
00048 #include "QmitkEuler2DTransformView.h"
00049 #include "QmitkSimilarity2DTransformView.h"
00050 #include "QmitkCenteredSimilarity2DTransformView.h"
00051
00052 #include "QmitkMeanSquaresMetricView.h"
00053 #include "QmitkNormalizedCorrelationMetricView.h"
00054 #include "QmitkGradientDifferenceMetricView.h"
00055 #include "QmitkKullbackLeiblerCompareHistogramMetricView.h"
00056 #include "QmitkCorrelationCoefficientHistogramMetricView.h"
00057 #include "QmitkMeanSquaresHistogramMetricView.h"
00058 #include "QmitkMutualInformationHistogramMetricView.h"
00059 #include "QmitkNormalizedMutualInformationHistogramMetricView.h"
00060 #include "QmitkMattesMutualInformationMetricView.h"
00061 #include "QmitkMeanReciprocalSquareDifferenceMetricView.h"
00062 #include "QmitkMutualInformationMetricView.h"
00063 #include "QmitkMatchCardinalityMetricView.h"
00064 #include "QmitkKappaStatisticMetricView.h"
00065
00066 #include "QmitkExhaustiveOptimizerView.h"
00067 #include "QmitkGradientDescentOptimizerView.h"
00068 #include "QmitkQuaternionRigidTransformGradientDescentOptimizerView.h"
00069 #include "QmitkLBFGSBOptimizerView.h"
00070 #include "QmitkOnePlusOneEvolutionaryOptimizerView.h"
00071 #include "QmitkPowellOptimizerView.h"
00072 #include "QmitkFRPROptimizerView.h"
00073 #include "QmitkRegularStepGradientDescentOptimizerView.h"
00074 #include "QmitkVersorTransformOptimizerView.h"
00075 #include "QmitkAmoebaOptimizerView.h"
00076 #include "QmitkConjugateGradientOptimizerView.h"
00077 #include "QmitkLBFGSOptimizerView.h"
00078 #include "QmitkSPSAOptimizerView.h"
00079 #include "QmitkVersorRigid3DTransformOptimizerView.h"
00080
00081 QmitkRigidRegistrationSelectorView::QmitkRigidRegistrationSelectorView(QWidget* parent, Qt::WindowFlags f ) : QWidget( parent, f ),
00082 m_FixedNode(NULL), m_FixedMaskNode(NULL), m_MovingNode(NULL), m_MovingMaskNode(NULL), m_FixedDimension(0), m_MovingDimension(0),
00083 m_StopOptimization(false), m_GeometryItkPhysicalToWorldTransform(NULL), m_GeometryWorldToItkPhysicalTransform(NULL),
00084 m_MovingGeometry(NULL), m_ImageGeometry(NULL)
00085 {
00086 m_Controls.setupUi(parent);
00087
00088 this->AddTransform(new QmitkTranslationTransformView(this, f));
00089 this->AddTransform(new QmitkScaleTransformView(this, f));
00090 this->AddTransform(new QmitkScaleLogarithmicTransformView(this, f));
00091 this->AddTransform(new QmitkAffineTransformView(this, f));
00092 this->AddTransform(new QmitkFixedCenterOfRotationAffineTransformView(this, f));
00093 this->AddTransform(new QmitkEuler3DTransformView(this, f));
00094 this->AddTransform(new QmitkCenteredEuler3DTransformView(this, f));
00095 this->AddTransform(new QmitkQuaternionRigidTransformView(this, f));
00096 this->AddTransform(new QmitkVersorTransformView(this, f));
00097 this->AddTransform(new QmitkVersorRigid3DTransformView(this, f));
00098 this->AddTransform(new QmitkScaleSkewVersor3DTransformView(this, f));
00099 this->AddTransform(new QmitkSimilarity3DTransformView(this, f));
00100 this->AddTransform(new QmitkRigid2DTransformView(this, f));
00101 this->AddTransform(new QmitkCenteredRigid2DTransformView(this, f));
00102 this->AddTransform(new QmitkEuler2DTransformView(this, f));
00103 this->AddTransform(new QmitkSimilarity2DTransformView(this, f));
00104 this->AddTransform(new QmitkCenteredSimilarity2DTransformView(this, f));
00105
00106 this->AddMetric(new QmitkMeanSquaresMetricView(this, f));
00107 this->AddMetric(new QmitkNormalizedCorrelationMetricView(this, f));
00108 this->AddMetric(new QmitkGradientDifferenceMetricView(this, f));
00109 this->AddMetric(new QmitkKullbackLeiblerCompareHistogramMetricView(this, f));
00110 this->AddMetric(new QmitkCorrelationCoefficientHistogramMetricView(this, f));
00111 this->AddMetric(new QmitkMeanSquaresHistogramMetricView(this, f));
00112 this->AddMetric(new QmitkMutualInformationHistogramMetricView(this, f));
00113 this->AddMetric(new QmitkNormalizedMutualInformationHistogramMetricView(this, f));
00114 this->AddMetric(new QmitkMattesMutualInformationMetricView(this, f));
00115 this->AddMetric(new QmitkMeanReciprocalSquareDifferenceMetricView(this, f));
00116 this->AddMetric(new QmitkMutualInformationMetricView(this, f));
00117 this->AddMetric(new QmitkMatchCardinalityMetricView(this, f));
00118 this->AddMetric(new QmitkKappaStatisticMetricView(this, f));
00119
00120 this->AddOptimizer(new QmitkExhaustiveOptimizerView(this, f));
00121 this->AddOptimizer(new QmitkGradientDescentOptimizerView(this, f));
00122 this->AddOptimizer(new QmitkQuaternionRigidTransformGradientDescentOptimizerView(this, f));
00123 this->AddOptimizer(new QmitkLBFGSBOptimizerView(this, f));
00124 this->AddOptimizer(new QmitkOnePlusOneEvolutionaryOptimizerView(this, f));
00125 this->AddOptimizer(new QmitkPowellOptimizerView(this, f));
00126 this->AddOptimizer(new QmitkFRPROptimizerView(this, f));
00127 this->AddOptimizer(new QmitkRegularStepGradientDescentOptimizerView(this, f));
00128 this->AddOptimizer(new QmitkVersorTransformOptimizerView(this, f));
00129 this->AddOptimizer(new QmitkAmoebaOptimizerView(this, f));
00130 this->AddOptimizer(new QmitkConjugateGradientOptimizerView(this, f));
00131 this->AddOptimizer(new QmitkLBFGSOptimizerView(this, f));
00132 this->AddOptimizer(new QmitkSPSAOptimizerView(this, f));
00133 this->AddOptimizer(new QmitkVersorRigid3DTransformOptimizerView(this, f));
00134
00135 m_Observer = mitk::RigidRegistrationObserver::New();
00136 m_Controls.m_TransformFrame->setEnabled(true);
00137 m_Controls.m_MetricFrame->setEnabled(true);
00138 m_Controls.m_OptimizerFrame->setEnabled(true);
00139 m_Controls.m_InterpolatorFrame->setEnabled(true);
00140
00141 m_Controls.m_TransformFrame->hide();
00142 m_Controls.m_MetricFrame->hide();
00143 m_Controls.m_OptimizerFrame->hide();
00144 m_Controls.m_InterpolatorFrame->hide();
00145 m_Controls.m_TransformBox->setCurrentIndex(0);
00146 m_Controls.m_MetricBox->setCurrentIndex(0);
00147 m_Controls.m_OptimizerBox->setCurrentIndex(0);
00148 m_Controls.m_TransformWidgetStack->setCurrentIndex(0);
00149 m_Controls.m_MetricWidgetStack->setCurrentIndex(0);
00150 m_Controls.m_OptimizerWidgetStack->setCurrentIndex(0);
00152 this->TransformSelected(m_Controls.m_TransformBox->currentIndex());
00153 this->MetricSelected(m_Controls.m_MetricBox->currentIndex());
00154 this->OptimizerSelected(m_Controls.m_OptimizerBox->currentIndex());
00155
00156
00158 connect( m_Controls.m_TransformGroup, SIGNAL(clicked(bool)), m_Controls.m_TransformFrame, SLOT(setVisible(bool)));
00159 connect( m_Controls.m_TransformBox, SIGNAL(activated(int)), m_Controls.m_TransformWidgetStack, SLOT(setCurrentIndex(int)));
00160 connect( m_Controls.m_TransformBox, SIGNAL(activated(int)), this, SLOT(TransformSelected(int)));
00161 connect( m_Controls.m_MetricBox, SIGNAL(activated(int)), this, SLOT(MetricSelected(int)));
00162 connect( m_Controls.m_OptimizerBox, SIGNAL(activated(int)), this, SLOT(OptimizerSelected(int)));
00163 connect( m_Controls.m_MetricGroup, SIGNAL(clicked(bool)), m_Controls.m_MetricFrame, SLOT(setVisible(bool)));
00164 connect( m_Controls.m_MetricBox, SIGNAL(activated(int)), m_Controls.m_MetricWidgetStack, SLOT(setCurrentIndex(int)));
00165 connect( m_Controls.m_OptimizerGroup, SIGNAL(clicked(bool)), m_Controls.m_OptimizerFrame, SLOT(setVisible(bool)));
00166 connect( m_Controls.m_OptimizerBox, SIGNAL(activated(int)), m_Controls.m_OptimizerWidgetStack, SLOT(setCurrentIndex(int)));
00167 connect( m_Controls.m_InterpolatorGroup, SIGNAL(toggled(bool)), m_Controls.m_InterpolatorFrame, SLOT(setVisible(bool)));
00168
00169 m_Preset = new mitk::RigidRegistrationPreset();
00170 m_Preset->LoadPreset();
00171
00172 m_TestPreset = new mitk::RigidRegistrationTestPreset();
00173 m_TestPreset->LoadPreset();
00174
00175 this->DoLoadRigidRegistrationPreset("AffineMutualInformationGradientDescent", false);
00176 }
00177
00178 QmitkRigidRegistrationSelectorView::~QmitkRigidRegistrationSelectorView()
00179 {
00180 }
00181
00183 void QmitkRigidRegistrationSelectorView::CalculateTransformation(unsigned int timestep)
00184 {
00185 if (m_FixedNode.IsNotNull() && m_MovingNode.IsNotNull())
00186 {
00187 emit AddNewTransformationToUndoList();
00188
00189 mitk::Image::Pointer fimage = dynamic_cast<mitk::Image*>(m_FixedNode->GetData());
00190 mitk::Image::Pointer mimage = dynamic_cast<mitk::Image*>(m_MovingNode->GetData());
00191 mitk::Image::Pointer mmimage = NULL;
00192 mitk::Image::Pointer fmimage = NULL;
00193 if (m_MovingMaskNode.IsNotNull())
00194 {
00195 mmimage = dynamic_cast<mitk::Image*>(m_MovingMaskNode->GetData());
00196 }
00197 if (m_FixedMaskNode.IsNotNull())
00198 {
00199 fmimage = dynamic_cast<mitk::Image*>(m_FixedMaskNode->GetData());
00200 }
00201
00202 mitk::ImageTimeSelector::Pointer its = mitk::ImageTimeSelector::New();
00203
00204 if(fimage->GetDimension()>3)
00205 {
00206 its->SetInput(fimage);
00207 its->SetTimeNr(timestep);
00208 its->Update();
00209 fimage = its->GetOutput();
00210 }
00211
00212 if(mimage->GetDimension()>3)
00213 {
00214 its->SetInput(mimage);
00215 its->SetTimeNr(timestep);
00216 its->Update();
00217 mimage = its->GetOutput();
00218 }
00219
00220
00221 m_ImageGeometry = m_MovingNode->GetData()->GetGeometry()->Clone();
00222 std::cout << "Moving Image Geometry (IndexToWorldTransform)" << std::endl;
00223 std::cout << m_ImageGeometry->GetIndexToWorldTransform()->GetMatrix();
00224 mitk::Geometry3D::TransformType::InputPointType center = m_ImageGeometry->GetIndexToWorldTransform()->GetCenter();
00225 std::cout << "center " << center[0] << " " << center[1] << " " << center[2] << std::endl;
00226 mitk::Geometry3D::TransformType::OutputVectorType offset = m_ImageGeometry->GetIndexToWorldTransform()->GetOffset();
00227 std::cout << "offset " << offset[0] << " " << offset[1] << " " << offset[2] << std::endl;
00228 std::cout << std::endl;
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241 m_MovingGeometry = m_MovingNode->GetData()->GetGeometry();
00242
00243 unsigned long size;
00244 size = m_MovingNodeChildren->Size();
00245 mitk::DataNode::Pointer childNode;
00246 for (unsigned long i = 0; i < size; ++i)
00247 {
00248 m_ChildNodes.insert(std::pair<mitk::DataNode::Pointer, mitk::Geometry3D*>(m_MovingNodeChildren->GetElement(i), m_MovingNodeChildren->GetElement(i)->GetData()->GetGeometry()));
00249 m_ChildNodes2.insert(std::pair<mitk::DataNode::Pointer, mitk::AffineGeometryFrame3D::Pointer>(m_MovingNodeChildren->GetElement(i), m_MovingNodeChildren->GetElement(i)->GetData()->GetGeometry()->Clone()));
00250 }
00251
00252 m_GeometryWorldToItkPhysicalTransform = mitk::Geometry3D::TransformType::New();
00253 GetWorldToItkPhysicalTransform(m_MovingGeometry, m_GeometryWorldToItkPhysicalTransform.GetPointer());
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264 m_GeometryItkPhysicalToWorldTransform = mitk::Geometry3D::TransformType::New();
00265 mitk::Geometry3D::TransformType::Pointer fixedWorld2Phys = mitk::Geometry3D::TransformType::New();
00266 GetWorldToItkPhysicalTransform(m_FixedNode->GetData()->GetGeometry(), fixedWorld2Phys.GetPointer());
00267 fixedWorld2Phys->GetInverse(m_GeometryItkPhysicalToWorldTransform);
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278 itk::ReceptorMemberCommand<QmitkRigidRegistrationSelectorView>::Pointer command = itk::ReceptorMemberCommand<QmitkRigidRegistrationSelectorView>::New();
00279 command->SetCallbackFunction(this, &QmitkRigidRegistrationSelectorView::SetOptimizerValue);
00280 int observer = m_Observer->AddObserver( itk::AnyEvent(), command );
00281
00282 std::vector<std::string> presets;
00283
00284 mitk::ImageRegistrationMethod::Pointer registration = mitk::ImageRegistrationMethod::New();
00285
00286 registration->SetObserver(m_Observer);
00287 registration->SetInterpolator(m_Controls.m_InterpolatorBox->currentIndex());
00288 registration->SetReferenceImage(fimage);
00289 registration->SetInput(mimage);
00290 if (mmimage.IsNotNull())
00291 {
00292 registration->SetMovingMask(mmimage);
00293 }
00294 if (fmimage.IsNotNull())
00295 {
00296 registration->SetFixedMask(fmimage);
00297 }
00298
00299 dynamic_cast<QmitkRigidRegistrationTransformsGUIBase*>(m_Controls.m_TransformWidgetStack->currentWidget())->SetFixedImage(dynamic_cast<mitk::Image*>(m_FixedNode->GetData()));
00300 dynamic_cast<QmitkRigidRegistrationTransformsGUIBase*>(m_Controls.m_TransformWidgetStack->currentWidget())->SetMovingImage(dynamic_cast<mitk::Image*>(m_MovingNode->GetData()));
00301 registration->SetOptimizerScales(dynamic_cast<QmitkRigidRegistrationTransformsGUIBase*>(m_Controls.m_TransformWidgetStack->currentWidget())->GetScales());
00302 registration->SetTransform(dynamic_cast<QmitkRigidRegistrationTransformsGUIBase*>(m_Controls.m_TransformWidgetStack->currentWidget())->GetTransform());
00303
00304 dynamic_cast<QmitkRigidRegistrationMetricsGUIBase*>(m_Controls.m_MetricWidgetStack->currentWidget())->SetMovingImage(dynamic_cast<mitk::Image*>(m_MovingNode->GetData()));
00305 registration->SetMetric(dynamic_cast<QmitkRigidRegistrationMetricsGUIBase*>(m_Controls.m_MetricWidgetStack->currentWidget())->GetMetric());
00306
00307 registration->SetOptimizer(dynamic_cast<QmitkRigidRegistrationOptimizerGUIBase*>(m_Controls.m_OptimizerWidgetStack->currentWidget())->GetOptimizer());
00308
00309 double time(0.0);
00310 double tstart(0.0);
00311 tstart = clock();
00312
00313 try
00314 {
00315 registration->Update();
00316 }
00317 catch (itk::ExceptionObject e)
00318 {
00319 MITK_INFO << "Caught exception: "<<e.GetDescription();
00320 QMessageBox::information( this, "Registration exception", e.GetDescription());
00321 mitk::ProgressBar::GetInstance()->Progress(20);
00322 }
00323
00324 time += clock() - tstart;
00325 time = time / CLOCKS_PER_SEC;
00326
00327
00328 MITK_INFO << "Registration Time: " << time;
00329
00330 m_Observer->RemoveObserver(observer);
00331 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00332 }
00333 }
00334
00335 void QmitkRigidRegistrationSelectorView::SetFixedNode( mitk::DataNode * fixedNode )
00336 {
00337 m_FixedNode = fixedNode;
00338 m_Controls.m_TransformBox->setCurrentIndex(m_Controls.m_TransformBox->currentIndex());
00339 }
00340
00341 void QmitkRigidRegistrationSelectorView::SetFixedDimension( int dimension )
00342 {
00343 m_FixedDimension = dimension;
00344 }
00345
00346 void QmitkRigidRegistrationSelectorView::SetMovingNode( mitk::DataNode * movingNode )
00347 {
00348 m_MovingNode = movingNode;
00349 this->TransformSelected(m_Controls.m_TransformBox->currentIndex());
00350 }
00351
00352 void QmitkRigidRegistrationSelectorView::SetMovingDimension(int dimension )
00353 {
00354 m_MovingDimension = dimension;
00355 }
00356
00357
00358
00359
00360
00361
00362 void QmitkRigidRegistrationSelectorView::SetOptimizerValue( const itk::EventObject & )
00363 {
00364 if (m_StopOptimization)
00365 {
00366 m_Observer->SetStopOptimization(true);
00367 m_StopOptimization = false;
00368 }
00369
00370
00371 double value = m_Observer->GetCurrentOptimizerValue();
00372
00373
00374 itk::Array<double> transformParams = m_Observer->GetCurrentTranslation();
00375
00376
00377
00378 vtkMatrix4x4* vtkmatrix = vtkMatrix4x4::New();
00379 vtkmatrix->Identity();
00380
00381
00382 vtkTransform* vtktransform = vtkTransform::New();
00383
00384 if (m_MovingNode.IsNotNull())
00385 {
00386 vtktransform = dynamic_cast<QmitkRigidRegistrationTransformsGUIBase*>(m_Controls.m_TransformWidgetStack->currentWidget())->Transform(vtkmatrix, vtktransform, transformParams);
00387
00388
00389
00390 vtkMatrix4x4* vtkmatrix_inv = vtkMatrix4x4::New();
00391 vtktransform->GetInverse(vtkmatrix_inv);
00392
00393
00394 m_MovingGeometry->GetIndexToWorldTransform()->SetIdentity();
00395
00396
00397
00398
00399 m_MovingGeometry->SetIndexToWorldTransformByVtkMatrix(vtkmatrix_inv);
00400
00401
00402
00403
00404
00405
00406
00407 #if !defined(ITK_IMAGE_BEHAVES_AS_ORIENTED_IMAGE)
00408
00409
00410 m_MovingGeometry->Compose(m_GeometryWorldToItkPhysicalTransform, 1);
00411
00412
00413 m_MovingGeometry->Compose(m_ImageGeometry->GetIndexToWorldTransform(), 1);
00414
00415
00416 m_MovingGeometry->Compose(m_GeometryItkPhysicalToWorldTransform, 0);
00417
00418 #else
00419 m_MovingGeometry->Compose(m_ImageGeometry->GetIndexToWorldTransform(), 1);
00420 #endif
00421
00422
00423
00424
00425
00426
00427 std::map<mitk::DataNode::Pointer, mitk::Geometry3D*>::iterator iter;
00428 std::map<mitk::DataNode::Pointer, mitk::AffineGeometryFrame3D::Pointer>::iterator iter2;
00429 mitk::DataNode::Pointer childNode;
00430 for( iter = m_ChildNodes.begin(); iter != m_ChildNodes.end(); iter++ )
00431 {
00432 childNode = (*iter).first;
00433 if (childNode.IsNotNull())
00434 {
00435 mitk::Geometry3D* childGeometry;
00436 mitk::AffineGeometryFrame3D::Pointer childImageGeometry;
00437
00438 childGeometry = (*iter).second;
00439 iter2 = m_ChildNodes2.find(childNode);
00440 childImageGeometry = (*iter2).second;
00441
00442 childGeometry->GetIndexToWorldTransform()->SetIdentity();
00443
00444
00445
00446
00447 childGeometry->SetIndexToWorldTransformByVtkMatrix(vtkmatrix_inv);
00448
00449 #if !defined(ITK_IMAGE_BEHAVES_AS_ORIENTED_IMAGE)
00450
00451
00452 childGeometry->Compose(m_GeometryWorldToItkPhysicalTransform, 1);
00453
00454
00455 childGeometry->Compose(childImageGeometry->GetIndexToWorldTransform(), 1);
00456
00457
00458 childGeometry->Compose(m_GeometryItkPhysicalToWorldTransform, 0);
00459
00460 #else
00461 childGeometry->Compose(childImageGeometry->GetIndexToWorldTransform(), 1);
00462 #endif
00463 }
00464 }
00465
00466 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00467 }
00468 emit OptimizerChanged(value);
00469 }
00470
00473 void QmitkRigidRegistrationSelectorView::TransformSelected( int transform )
00474 {
00475 if (m_FixedNode.IsNotNull())
00476 {
00477 dynamic_cast<QmitkRigidRegistrationTransformsGUIBase*>(m_Controls.m_TransformWidgetStack->widget(transform))->SetFixedImage(dynamic_cast<mitk::Image*>(m_FixedNode->GetData()));
00478 }
00479 if (m_MovingNode.IsNotNull())
00480 {
00481 dynamic_cast<QmitkRigidRegistrationTransformsGUIBase*>(m_Controls.m_TransformWidgetStack->widget(transform))->SetMovingImage(dynamic_cast<mitk::Image*>(m_MovingNode->GetData()));
00482 }
00483 int numberOfTransformParameters = dynamic_cast<QmitkRigidRegistrationTransformsGUIBase*>(m_Controls.m_TransformWidgetStack->widget(transform))->GetNumberOfTransformParameters();
00484 dynamic_cast<QmitkRigidRegistrationOptimizerGUIBase*>(m_Controls.m_OptimizerWidgetStack->currentWidget())->SetNumberOfTransformParameters(numberOfTransformParameters);
00485
00486
00487 m_Controls.m_TransformWidgetStack->setFixedHeight( dynamic_cast<QmitkRigidRegistrationTransformsGUIBase*>(m_Controls.m_TransformWidgetStack->widget(transform))->minimumSizeHint().height() );
00488 this->OptimizerSelected(m_Controls.m_OptimizerWidgetStack->currentIndex());
00489 }
00490
00493 void QmitkRigidRegistrationSelectorView::MetricSelected( int metric )
00494 {
00495 if (m_FixedNode.IsNotNull())
00496 {
00497 dynamic_cast<QmitkRigidRegistrationMetricsGUIBase*>(m_Controls.m_MetricWidgetStack->widget(metric))->SetMovingImage(dynamic_cast<mitk::Image*>(m_MovingNode->GetData()));
00498 }
00499
00500
00501 m_Controls.m_MetricWidgetStack->setFixedHeight( dynamic_cast<QmitkRigidRegistrationMetricsGUIBase*>(m_Controls.m_MetricWidgetStack->widget(metric))->minimumSizeHint().height() );
00502 }
00503
00506 void QmitkRigidRegistrationSelectorView::OptimizerSelected( int optimizer )
00507 {
00508 int numberOfTransformParameters = dynamic_cast<QmitkRigidRegistrationTransformsGUIBase*>(m_Controls.m_TransformWidgetStack->currentWidget())->GetNumberOfTransformParameters();
00509 dynamic_cast<QmitkRigidRegistrationOptimizerGUIBase*>(m_Controls.m_OptimizerWidgetStack->widget(optimizer))->SetNumberOfTransformParameters(numberOfTransformParameters);
00510
00511
00512 m_Controls.m_OptimizerWidgetStack->setFixedHeight( dynamic_cast<QmitkRigidRegistrationOptimizerGUIBase*>(m_Controls.m_OptimizerWidgetStack->widget(optimizer))->minimumSizeHint().height() );
00513 }
00514
00515 void QmitkRigidRegistrationSelectorView::LoadRigidRegistrationParameter()
00516 {
00517 this->DoLoadRigidRegistrationParameter(false);
00518 }
00519
00520 void QmitkRigidRegistrationSelectorView::LoadRigidRegistrationTestParameter()
00521 {
00522 this->DoLoadRigidRegistrationParameter(true);
00523 }
00524
00525 void QmitkRigidRegistrationSelectorView::DoLoadRigidRegistrationParameter(bool testPreset)
00526 {
00527 std::map<std::string, itk::Array<double> > existingPresets;
00528 if (testPreset)
00529 {
00530 existingPresets = m_TestPreset->getTransformValuesPresets();
00531 }
00532 else
00533 {
00534 existingPresets = m_Preset->getTransformValuesPresets();
00535 }
00536
00537 std::map<std::string, itk::Array<double> >::iterator iter;
00538 std::list<std::string> presets;
00539 for( iter = existingPresets.begin(); iter != existingPresets.end(); iter++ )
00540 {
00541 presets.push_back( (*iter).first );
00542 }
00543 if (presets.empty())
00544 {
00545 QMessageBox::warning( NULL, "RigidRegistrationParameters.xml", "RigidRegistrationParameters.xml is empty/does not exist. There are no presets to select.");
00546 return;
00547 }
00548 presets.sort();
00549
00550 QmitkLoadPresetDialog dialog( this, 0, "Load Preset", presets );
00551 int dialogReturnValue = dialog.exec();
00552 if ( dialogReturnValue == QDialog::Rejected ) return;
00553
00554 this->DoLoadRigidRegistrationPreset(dialog.GetPresetName(), testPreset);
00555 }
00556
00557 void QmitkRigidRegistrationSelectorView::DoLoadRigidRegistrationPreset(std::string presetName, bool testPreset)
00558 {
00559 itk::Array<double> transformValues;
00560 if (testPreset)
00561 {
00562 transformValues = m_TestPreset->getTransformValues(presetName);
00563 }
00564 else
00565 {
00566 transformValues = m_Preset->getTransformValues(presetName);
00567 }
00568 m_Controls.m_TransformGroup->setChecked(true);
00569 m_Controls.m_TransformFrame->setVisible(true);
00570 m_Controls.m_TransformBox->setCurrentIndex((int)transformValues[0]);
00571 m_Controls.m_TransformWidgetStack->setCurrentIndex((int)transformValues[0]);
00572 this->TransformSelected((int)transformValues[0]);
00573 itk::Array<double> transformValuesForGUI;
00574 transformValuesForGUI.SetSize(transformValues.Size());
00575 transformValuesForGUI.fill(0);
00576 for (unsigned int i = 1; i < transformValues.Size(); i++)
00577 {
00578 transformValuesForGUI[i-1] = transformValues[i];
00579 }
00580 dynamic_cast<QmitkRigidRegistrationTransformsGUIBase*>(m_Controls.m_TransformWidgetStack->currentWidget())->SetTransformParameters(transformValuesForGUI);
00581
00582 itk::Array<double> metricValues;
00583 if (testPreset)
00584 {
00585 metricValues = m_TestPreset->getMetricValues(presetName);
00586 }
00587 else
00588 {
00589 metricValues = m_Preset->getMetricValues(presetName);
00590 }
00591 m_Controls.m_MetricGroup->setChecked(true);
00592 m_Controls.m_MetricFrame->setVisible(true);
00593 m_Controls.m_MetricBox->setCurrentIndex((int)metricValues[0]);
00594 m_Controls.m_MetricWidgetStack->setCurrentIndex((int)metricValues[0]);
00595 this->MetricSelected((int)metricValues[0]);
00596 itk::Array<double> metricValuesForGUI;
00597 metricValuesForGUI.SetSize(metricValues.Size());
00598 metricValuesForGUI.fill(0);
00599 for (unsigned int i = 1; i < metricValues.Size(); i++)
00600 {
00601 metricValuesForGUI[i-1] = metricValues[i];
00602 }
00603 dynamic_cast<QmitkRigidRegistrationMetricsGUIBase*>(m_Controls.m_MetricWidgetStack->currentWidget())->SetMetricParameters(metricValuesForGUI);
00604
00605 itk::Array<double> optimizerValues;
00606 if (testPreset)
00607 {
00608 optimizerValues = m_TestPreset->getOptimizerValues(presetName);
00609 }
00610 else
00611 {
00612 optimizerValues = m_Preset->getOptimizerValues(presetName);
00613 }
00614 m_Controls.m_OptimizerGroup->setChecked(true);
00615 m_Controls.m_OptimizerFrame->setVisible(true);
00616 m_Controls.m_OptimizerBox->setCurrentIndex((int)optimizerValues[0]);
00617 m_Controls.m_OptimizerWidgetStack->setCurrentIndex((int)optimizerValues[0]);
00618 this->OptimizerSelected((int)optimizerValues[0]);
00619 itk::Array<double> optimizerValuesForGUI;
00620 optimizerValuesForGUI.SetSize(optimizerValues.Size());
00621 optimizerValuesForGUI.fill(0);
00622 for (unsigned int i = 1; i < optimizerValues.Size(); i++)
00623 {
00624 optimizerValuesForGUI[i-1] = optimizerValues[i];
00625 }
00626 dynamic_cast<QmitkRigidRegistrationOptimizerGUIBase*>(m_Controls.m_OptimizerWidgetStack->currentWidget())->SetOptimizerParameters(optimizerValuesForGUI);
00627
00628 itk::Array<double> interpolatorValues;
00629 if (testPreset)
00630 {
00631 interpolatorValues = m_TestPreset->getInterpolatorValues(presetName);
00632 }
00633 else
00634 {
00635 interpolatorValues = m_Preset->getInterpolatorValues(presetName);
00636 }
00637 m_Controls.m_InterpolatorGroup->setChecked(true);
00638 m_Controls.m_InterpolatorFrame->setVisible(true);
00639 m_Controls.m_InterpolatorBox->setCurrentIndex((int)interpolatorValues[0]);
00640 }
00641
00642 void QmitkRigidRegistrationSelectorView::SaveRigidRegistrationParameter()
00643 {
00644 this->DoSaveRigidRegistrationParameter(false);
00645 }
00646
00647 void QmitkRigidRegistrationSelectorView::SaveRigidRegistrationTestParameter()
00648 {
00649 this->DoSaveRigidRegistrationParameter(true);
00650 }
00651
00652 void QmitkRigidRegistrationSelectorView::DoSaveRigidRegistrationParameter(bool testPreset)
00653 {
00654 bool ok;
00655 QString text = QInputDialog::getText(this,
00656 "Save Parameter Preset", "Enter name for preset:", QLineEdit::Normal,
00657 QString::null, &ok );
00658 if ( ok )
00659 {
00660 std::map<std::string, itk::Array<double> > existingPresets;
00661 if (testPreset)
00662 {
00663 existingPresets = m_TestPreset->getTransformValuesPresets();
00664 }
00665 else
00666 {
00667 existingPresets = m_Preset->getTransformValuesPresets();
00668 }
00669 std::map<std::string, itk::Array<double> >::iterator iter = existingPresets.find(std::string((const char*)text.toLatin1()));
00670 if (iter != existingPresets.end())
00671 {
00672 QMessageBox::critical( this, "Preset definition",
00673 "Presetname already exists.");
00674 return;
00675 }
00676 if (text.isEmpty())
00677 {
00678 QMessageBox::critical( this, "Preset definition",
00679 "Presetname has to be set.\n"
00680 "You have to enter a Presetname." );
00681 return;
00682 }
00683 itk::Array<double> transformValues;
00684 transformValues.SetSize(25);
00685 transformValues.fill(0);
00686 transformValues[0] = m_Controls.m_TransformBox->currentIndex();
00687
00688 itk::Array<double> transformValuesFromGUI = dynamic_cast<QmitkRigidRegistrationTransformsGUIBase*>(m_Controls.m_TransformWidgetStack->currentWidget())->GetTransformParameters();
00689 for (unsigned int i = 0; i < transformValuesFromGUI.Size(); i++)
00690 {
00691 transformValues[i+1] = transformValuesFromGUI[i];
00692 }
00693
00694 std::map<std::string, itk::Array<double> > transformMap;
00695 if (testPreset)
00696 {
00697 transformMap = m_TestPreset->getTransformValuesPresets();
00698 }
00699 else
00700 {
00701 transformMap = m_Preset->getTransformValuesPresets();
00702 }
00703 transformMap[std::string((const char*)text.toLatin1())] = transformValues;
00704
00705 itk::Array<double> metricValues;
00706 metricValues.SetSize(25);
00707 metricValues.fill(0);
00708 metricValues[0] = m_Controls.m_MetricBox->currentIndex();
00709 itk::Array<double> metricValuesFromGUI = dynamic_cast<QmitkRigidRegistrationMetricsGUIBase*>(m_Controls.m_MetricWidgetStack->currentWidget())->GetMetricParameters();
00710 for (unsigned int i = 0; i < metricValuesFromGUI.Size(); i++)
00711 {
00712 metricValues[i+1] = metricValuesFromGUI[i];
00713 }
00714
00715 std::map<std::string, itk::Array<double> > metricMap;
00716 if (testPreset)
00717 {
00718 metricMap = m_TestPreset->getMetricValuesPresets();
00719 }
00720 else
00721 {
00722 metricMap = m_Preset->getMetricValuesPresets();
00723 }
00724 metricMap[std::string((const char*)text.toLatin1())] = metricValues;
00725
00726 itk::Array<double> optimizerValues;
00727 optimizerValues.SetSize(25);
00728 optimizerValues.fill(0);
00729 optimizerValues[0] = m_Controls.m_OptimizerBox->currentIndex();
00730 itk::Array<double> optimizerValuesFromGUI = dynamic_cast<QmitkRigidRegistrationOptimizerGUIBase*>(m_Controls.m_OptimizerWidgetStack->currentWidget())->GetOptimizerParameters();
00731 for (unsigned int i = 0; i < optimizerValuesFromGUI.Size(); i++)
00732 {
00733 optimizerValues[i+1] = optimizerValuesFromGUI[i];
00734 }
00735
00736 std::map<std::string, itk::Array<double> > optimizerMap;
00737 if (testPreset)
00738 {
00739 optimizerMap = m_TestPreset->getOptimizerValuesPresets();
00740 }
00741 else
00742 {
00743 optimizerMap = m_Preset->getOptimizerValuesPresets();
00744 }
00745 optimizerMap[std::string((const char*)text.toLatin1())] = optimizerValues;
00746
00747 itk::Array<double> interpolatorValues;
00748 interpolatorValues.SetSize(25);
00749 interpolatorValues.fill(0);
00750 interpolatorValues[0] = m_Controls.m_InterpolatorBox->currentIndex();
00751
00752 std::map<std::string, itk::Array<double> > interpolatorMap;
00753 if (testPreset)
00754 {
00755 interpolatorMap = m_TestPreset->getInterpolatorValuesPresets();
00756 }
00757 else
00758 {
00759 interpolatorMap = m_Preset->getInterpolatorValuesPresets();
00760 }
00761 interpolatorMap[std::string((const char*)text.toLatin1())] = interpolatorValues;
00762
00763 if (testPreset)
00764 {
00765 m_TestPreset->newPresets(transformMap, metricMap, optimizerMap, interpolatorMap);
00766 }
00767 else
00768 {
00769 m_Preset->newPresets(transformMap, metricMap, optimizerMap, interpolatorMap);
00770 }
00771 }
00772 else
00773 {
00774
00775 }
00776 }
00777
00778 void QmitkRigidRegistrationSelectorView::StopOptimization(bool stopOptimization)
00779 {
00780 m_StopOptimization = stopOptimization;
00781 }
00782
00783 int QmitkRigidRegistrationSelectorView::GetSelectedTransform()
00784 {
00785 return m_Controls.m_TransformBox->currentIndex();
00786 }
00787
00788 void QmitkRigidRegistrationSelectorView::SetFixedMaskNode( mitk::DataNode * fixedMaskNode )
00789 {
00790 m_FixedMaskNode = fixedMaskNode;
00791 this->TransformSelected(m_Controls.m_TransformBox->currentIndex());
00792 }
00793
00794 void QmitkRigidRegistrationSelectorView::SetMovingMaskNode( mitk::DataNode * movingMaskNode )
00795 {
00796 m_MovingMaskNode = movingMaskNode;
00797 this->TransformSelected(m_Controls.m_TransformBox->currentIndex());
00798 }
00799
00800 void QmitkRigidRegistrationSelectorView::SetMovingNodeChildren(mitk::DataStorage::SetOfObjects::ConstPointer children)
00801 {
00802 m_MovingNodeChildren = children;
00803 }
00804
00805 void QmitkRigidRegistrationSelectorView::AddTransform(QmitkRigidRegistrationTransformsGUIBase* transform)
00806 {
00807 m_Controls.m_TransformBox->addItem(transform->GetName());
00808 int i = 0;
00809 if (!dynamic_cast<QmitkRigidRegistrationTransformsGUIBase*>(m_Controls.m_TransformWidgetStack->widget(i)))
00810 {
00811 m_Controls.m_TransformWidgetStack->addWidget(transform);
00812 m_Controls.m_TransformWidgetStack->removeWidget(m_Controls.m_TransformWidgetStack->widget(i));
00813 transform->SetupUI(m_Controls.m_TransformWidgetStack->widget(i));
00814 }
00815 else
00816 {
00817 i = m_Controls.m_TransformWidgetStack->addWidget(transform);
00818 transform->SetupUI(m_Controls.m_TransformWidgetStack->widget(i));
00819 }
00820 }
00821
00822 void QmitkRigidRegistrationSelectorView::AddMetric(QmitkRigidRegistrationMetricsGUIBase* metric)
00823 {
00824 m_Controls.m_MetricBox->addItem(metric->GetName());
00825 int i = 0;
00826 if (!dynamic_cast<QmitkRigidRegistrationMetricsGUIBase*>(m_Controls.m_MetricWidgetStack->widget(i)))
00827 {
00828 m_Controls.m_MetricWidgetStack->addWidget(metric);
00829 m_Controls.m_MetricWidgetStack->removeWidget(m_Controls.m_MetricWidgetStack->widget(i));
00830 metric->SetupUI(m_Controls.m_MetricWidgetStack->widget(i));
00831 }
00832 else
00833 {
00834 i = m_Controls.m_MetricWidgetStack->addWidget(metric);
00835 metric->SetupUI(m_Controls.m_MetricWidgetStack->widget(i));
00836 }
00837 }
00838
00839 void QmitkRigidRegistrationSelectorView::AddOptimizer(QmitkRigidRegistrationOptimizerGUIBase* optimizer)
00840 {
00841 m_Controls.m_OptimizerBox->addItem(optimizer->GetName());
00842 int i = 0;
00843 if (!dynamic_cast<QmitkRigidRegistrationOptimizerGUIBase*>(m_Controls.m_OptimizerWidgetStack->widget(i)))
00844 {
00845 m_Controls.m_OptimizerWidgetStack->addWidget(optimizer);
00846 m_Controls.m_OptimizerWidgetStack->removeWidget(m_Controls.m_OptimizerWidgetStack->widget(i));
00847 optimizer->SetupUI(m_Controls.m_OptimizerWidgetStack->widget(i));
00848 }
00849 else
00850 {
00851 i = m_Controls.m_OptimizerWidgetStack->addWidget(optimizer);
00852 optimizer->SetupUI(m_Controls.m_OptimizerWidgetStack->widget(i));
00853 }
00854 }