diff --git a/Modules/SurfaceRegistration/CMakeLists.txt b/Modules/SurfaceRegistration/CMakeLists.txt index 467124a7c8..ae81db85cd 100644 --- a/Modules/SurfaceRegistration/CMakeLists.txt +++ b/Modules/SurfaceRegistration/CMakeLists.txt @@ -1,5 +1,4 @@ mitk_create_module( SurfaceRegistration INCLUDE_DIRS PRIVATE src/DataManagement src/Interactions src/IO src/Rendering DEPENDS PUBLIC MitkCore - WARNINGS_AS_ERRORS -) + ) diff --git a/Modules/SurfaceRegistration/files.cmake b/Modules/SurfaceRegistration/files.cmake index 2a5c0e1d88..8c760ea658 100644 --- a/Modules/SurfaceRegistration/files.cmake +++ b/Modules/SurfaceRegistration/files.cmake @@ -1,11 +1,13 @@ file(GLOB_RECURSE H_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/include/*") set(CPP_FILES mitkShapeComparisonManager.cpp + DataManagement/mitkShortestDistanceCalculator.cpp + DataManagement/mitkSurfaceRegistrationICP.cpp ) set(RESOURCE_FILES Interactions/Paint.xml Interactions/PaintConfig.xml ) diff --git a/Modules/SurfaceRegistration/include/AwesomeImageInteractor.h b/Modules/SurfaceRegistration/include/AwesomeImageInteractor.h deleted file mode 100644 index 2e31d2330b..0000000000 --- a/Modules/SurfaceRegistration/include/AwesomeImageInteractor.h +++ /dev/null @@ -1,50 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef AwesomeImageInteractor_h -#define AwesomeImageInteractor_h - -#include -#include - -#include -namespace mitk -{ - - // See AwesomeImageFilter.h for details on typical class declarations - // in MITK. The actual functionality of this class is commented in its - // implementation file. - - class MITKSURFACEREGISTRATION_EXPORT AwesomeImageInteractor final : public mitk::DataInteractor - { - public: - mitkClassMacro(AwesomeImageInteractor, DataInteractor) - itkFactorylessNewMacro(Self) - - private: - AwesomeImageInteractor(); - ~AwesomeImageInteractor(); - - void ConnectActionsAndFunctions() override; - void DataNodeChanged() override; - - void Paint(mitk::StateMachineAction* action, mitk::InteractionEvent* event); - - itk::Index<3> m_LastPixelIndex; - }; - -#endif -} \ No newline at end of file diff --git a/Modules/SurfaceRegistration/include/MitkShapeComparisonManager.h b/Modules/SurfaceRegistration/include/MitkShapeComparisonManager.h index d532a4eaf2..35994bb794 100644 --- a/Modules/SurfaceRegistration/include/MitkShapeComparisonManager.h +++ b/Modules/SurfaceRegistration/include/MitkShapeComparisonManager.h @@ -1,49 +1,49 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef MitkShapeComparisonManager_h #define MitkShapeComparisonManager_h #include "mitkSurface.h" #include #include "mitkDataNode.h" -#include - +//#include "mitkSurfaceRegistrationICP.h" #include namespace mitk { - - class MITKSURFACEREGISTRATION_EXPORT ShapeComparisonManager + class MITKSURFACEREGISTRATION_EXPORT ShapeComparisonManager { public: - + ShapeComparisonManager(); ~ShapeComparisonManager(); void setMovingSurface(mitk::Surface::Pointer moving); void setTargetSurface(mitk::Surface::Pointer target); + mitk::DataNode::Pointer manageICPCalculation(mitk::Surface::Pointer movingSurface, mitk::Surface::Pointer targetSurface); + private: mitk::Surface::Pointer m_MovingSurface; mitk::Surface::Pointer m_TargetSurface; }; } #endif diff --git a/Modules/SurfaceRegistration/src/DataManagement/MitkShortestDistanceCalculator.h b/Modules/SurfaceRegistration/include/mitkShortestDistanceCalculator.h similarity index 58% rename from Modules/SurfaceRegistration/src/DataManagement/MitkShortestDistanceCalculator.h rename to Modules/SurfaceRegistration/include/mitkShortestDistanceCalculator.h index b4319c4e72..b89a6e5611 100644 --- a/Modules/SurfaceRegistration/src/DataManagement/MitkShortestDistanceCalculator.h +++ b/Modules/SurfaceRegistration/include/mitkShortestDistanceCalculator.h @@ -1,37 +1,37 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ -#ifndef MitkShortestDistanceCalculator_h -#define MitkShortestDistanceCalculator_h +#ifndef mitkShortestDistanceCalculator_h +#define mitkShortestDistanceCalculator_h #include #include -class MitkShortestDistanceCalculator -{ -public: - MitkShortestDistanceCalculator(const mitk::Surface *moving, const mitk::Surface *target); - ~MitkShortestDistanceCalculator(); - - void calculateShortestDistance(); - -private: - vtkPoints *m_PointsMoving; - vtkPoints *m_PointsTarget; +namespace mitk{ + class ShortestDistanceCalculator + { + public: + ShortestDistanceCalculator(const mitk::Surface *moving, const mitk::Surface *target); + ~ShortestDistanceCalculator(); + void calculateShortestDistance(); + private: + vtkPoints *m_PointsMoving; + vtkPoints *m_PointsTarget; + }; }; #endif \ No newline at end of file diff --git a/Modules/SurfaceRegistration/src/DataManagement/SurfaceRegistrationICP.h b/Modules/SurfaceRegistration/include/mitkSurfaceRegistrationICP.h similarity index 65% rename from Modules/SurfaceRegistration/src/DataManagement/SurfaceRegistrationICP.h rename to Modules/SurfaceRegistration/include/mitkSurfaceRegistrationICP.h index 88af26be45..dd228e7325 100644 --- a/Modules/SurfaceRegistration/src/DataManagement/SurfaceRegistrationICP.h +++ b/Modules/SurfaceRegistration/include/mitkSurfaceRegistrationICP.h @@ -1,36 +1,34 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include #include #include namespace mitk{ - -#ifndef MitkSurfaceRegistrationICP_h -#define MitkSurfaceRegistrationICP_h -class SurfaceRegistrationICP -{ -public: - SurfaceRegistrationICP(); - ~SurfaceRegistrationICP(); - - vtkSmartPointer CalculateICP(mitk::Surface &moving, mitk::Surface &target); -private: - -}; +#ifndef mitkSurfaceRegistrationICP_h +#define mitkSurfaceRegistrationICP_h + class SurfaceRegistrationICP + { + public: + SurfaceRegistrationICP(); + ~SurfaceRegistrationICP(); + + mitk::Surface::Pointer CalculateICP(mitk::Surface::Pointer movingSurface, mitk::Surface::Pointer targetSurface); + private: + }; #endif }; \ No newline at end of file diff --git a/Modules/SurfaceRegistration/src/AwesomeImageInteractor.cpp b/Modules/SurfaceRegistration/src/AwesomeImageInteractor.cpp deleted file mode 100644 index 71fd1753bf..0000000000 --- a/Modules/SurfaceRegistration/src/AwesomeImageInteractor.cpp +++ /dev/null @@ -1,185 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include - -#include -#include -#include - -#include - - - - // Helper function to get an image from a data node. - static mitk::Image::Pointer GetImage(mitk::DataNode::Pointer dataNode) - { - if (dataNode.IsNull()) - mitkThrow(); - - mitk::Image::Pointer image = dynamic_cast(dataNode->GetData()); - - if (image.IsNull()) - mitkThrow(); - - return image; - } - - // Helper function to get a geometry of an image for a specific time step. - static mitk::BaseGeometry::Pointer GetGeometry(mitk::Image::Pointer image, unsigned int timeStep) - { - mitk::TimeGeometry::Pointer timeGeometry = image->GetTimeGeometry(); - - if (timeGeometry.IsNull()) - mitkThrow(); - - auto geometry = timeGeometry->GetGeometryForTimeStep(timeStep); - - if (geometry.IsNull()) - mitkThrow(); - - return geometry; - } - - // The actual painting happens here. We're using a write accessor to gain safe - // write access to our image. The whole image volume for a given time step is - // locked. However, it's also possible - and preferable - to lock the slice of - // interest only. - template - static void Paint(mitk::Image::Pointer image, itk::Index<3> index, unsigned int timeStep) - { - // As soon as the ImagePixelWriteAccessor object goes out of scope at the - // end of this function, the image will be unlocked again (RAII). - mitk::ImagePixelWriteAccessor writeAccessor(image, image->GetVolumeData(timeStep)); - writeAccessor.SetPixelByIndex(index, std::numeric_limits::min()); - - // Don't forget to update the modified time stamp of the image. Otherwise, - // everything downstream wouldn't recognize that the image changed, - // including the rendering system. - image->Modified(); - } - - // Helper function to multiplex the actual Paint function call for different - // pixel types. As it's cumbersome and ugly, you may want to avoid such - // functions by using ITK for the actual painting and use the ITK access - // macros like we did for the AwesomeImageFilter. - static void Paint(mitk::Image::Pointer image, itk::Index<3> index, unsigned int timeStep) - { - switch (image->GetPixelType().GetComponentType()) - { - case itk::ImageIOBase::CHAR: - Paint(image, index, timeStep); - break; - - case itk::ImageIOBase::UCHAR: - Paint(image, index, timeStep); - break; - - case itk::ImageIOBase::SHORT: - Paint(image, index, timeStep); - break; - - case itk::ImageIOBase::USHORT: - Paint(image, index, timeStep); - break; - - case itk::ImageIOBase::INT: - Paint(image, index, timeStep); - break; - - case itk::ImageIOBase::UINT: - Paint(image, index, timeStep); - break; - - default: - mitkThrow(); - } - } - - mitk::AwesomeImageInteractor::AwesomeImageInteractor() - { - } - - mitk::AwesomeImageInteractor::~AwesomeImageInteractor() - { - } - - void mitk::AwesomeImageInteractor::ConnectActionsAndFunctions() - { - // Wire up this interactor with the state machine that is described by - // resource/Interactions/Paint.xml. - CONNECT_FUNCTION("paint", Paint) - } - - void mitk::AwesomeImageInteractor::DataNodeChanged() - { - // You almost always want to reset the state machine when the interactor - // has been attached to another data node. - this->ResetToStartState(); - } - - // The state machine is wired up with this Paint method. We wrote a few helper - // functions at the top of this files to keep this method clear and easy to - // read. - void mitk::AwesomeImageInteractor::Paint(mitk::StateMachineAction* action, mitk::InteractionEvent* event) - { - try - { - auto renderer = event->GetSender(); - - auto image = GetImage(this->GetDataNode()); - auto timeStep = renderer->GetTimeStep(); - auto geometry = GetGeometry(image, timeStep); - - // This method is wired up to mouse events. Thus, we can safely assume - // that the following cast will succeed and we have access to the mouse - // position and the first intersection point of a ray originating at the - // mouse position and shot into the scene. Convenient, isn't it? :-) - auto positionEvent = dynamic_cast(event); - auto position = positionEvent->GetPositionInWorld(); - - if (!geometry->IsInside(position)) - return; // Nothing to paint, as we're not inside the image bounds. - - // Okay, we're safe. Convert the mouse position to the index of the pixel - // we're pointing at. - itk::Index<3> index; - geometry->WorldToIndex<3>(position, index); - - // We don't need to paint over and over again while moving the mouse - // pointer inside the same pixel. That's especially relevant when operating - // on zoomed images. - if (index != m_LastPixelIndex) - { - // And finally... - ::Paint(image, index, timeStep); - - // Nearly done. We request the renderer to update the render window in - // order to see the result immediately. Actually, we should update all - // of the render windows by caling RequestUpdateAll() instead, as the - // painted pixels are possibly visible in other render windows, too. - // However, we decided to prefer performance here. - mitk::RenderingManager::GetInstance()->RequestUpdate(positionEvent->GetSender()->GetRenderWindow()); - MITK_INFO << index[0] << " " << index[1] << " " << index[2]; - - m_LastPixelIndex = index; - } - } - catch (...) - { - return; - } - } diff --git a/Modules/SurfaceRegistration/src/DataManagement/MitkShortestDistanceCalculator.cpp b/Modules/SurfaceRegistration/src/DataManagement/MitkShortestDistanceCalculator.cpp index 26294a2fd4..74561fce49 100644 --- a/Modules/SurfaceRegistration/src/DataManagement/MitkShortestDistanceCalculator.cpp +++ b/Modules/SurfaceRegistration/src/DataManagement/MitkShortestDistanceCalculator.cpp @@ -1,35 +1,33 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ -#include "MitkShortestDistanceCalculator.h" +#include "mitkShortestDistanceCalculator.h" - -MitkShortestDistanceCalculator::MitkShortestDistanceCalculator(const mitk::Surface *moving, const mitk::Surface *target) +mitk::ShortestDistanceCalculator::ShortestDistanceCalculator(const mitk::Surface *moving, const mitk::Surface *target) { - m_PointsMoving->DeepCopy(moving->GetVtkPolyData()->GetPoints()); - m_PointsTarget->DeepCopy(target->GetVtkPolyData()->GetPoints()); + /* m_PointsMoving->DeepCopy(moving->GetVtkPolyData()->GetPoints()); + m_PointsTarget->DeepCopy(target->GetVtkPolyData()->GetPoints());*/ } - -MitkShortestDistanceCalculator::~MitkShortestDistanceCalculator() +mitk::ShortestDistanceCalculator::~ShortestDistanceCalculator() { - m_PointsMoving = nullptr; - m_PointsTarget = nullptr; + /*m_PointsMoving = nullptr; + m_PointsTarget = nullptr;*/ } -void MitkShortestDistanceCalculator::calculateShortestDistance() +void mitk::ShortestDistanceCalculator::calculateShortestDistance() { MITK_INFO << "calculate shortest distance ..."; } \ No newline at end of file diff --git a/Modules/SurfaceRegistration/src/DataManagement/SurfaceRegistrationICP.cpp b/Modules/SurfaceRegistration/src/DataManagement/SurfaceRegistrationICP.cpp deleted file mode 100644 index e7df59f35c..0000000000 --- a/Modules/SurfaceRegistration/src/DataManagement/SurfaceRegistrationICP.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "SurfaceRegistrationICP.h" - - -mitk::SurfaceRegistrationICP::SurfaceRegistrationICP() -{ -} - - -mitk::SurfaceRegistrationICP::~SurfaceRegistrationICP() -{ -} - -vtkSmartPointer SurfaceRegistrationICPCalculateICP(mitk::Surface &moving, mitk::Surface &target){ - vtkSmartPointer registeredData; - return registeredData; -} \ No newline at end of file diff --git a/Modules/SurfaceRegistration/src/DataManagement/mitkSurfaceRegistrationICP.cpp b/Modules/SurfaceRegistration/src/DataManagement/mitkSurfaceRegistrationICP.cpp new file mode 100644 index 0000000000..560c3230e2 --- /dev/null +++ b/Modules/SurfaceRegistration/src/DataManagement/mitkSurfaceRegistrationICP.cpp @@ -0,0 +1,49 @@ +#include "mitkSurfaceRegistrationICP.h" + +#include +#include +#include +#include +#include +#include + +mitk::SurfaceRegistrationICP::SurfaceRegistrationICP() +{ +} + +mitk::SurfaceRegistrationICP::~SurfaceRegistrationICP() +{ +} + +mitk::Surface::Pointer mitk::SurfaceRegistrationICP::CalculateICP(mitk::Surface::Pointer movingSurface, mitk::Surface::Pointer targetSurface) //void +{ + vtkSmartPointer icp = vtkSmartPointer::New(); + icp->SetCheckMeanDistance(1); + + icp->SetSource(movingSurface->GetVtkPolyData()); + icp->SetTarget(targetSurface->GetVtkPolyData()); + icp->SetMaximumNumberOfIterations(1000); + icp->SetMaximumMeanDistance(0.01); + icp->SetMeanDistanceModeToRMS(); + icp->StartByMatchingCentroidsOn(); + icp->SetMaximumNumberOfLandmarks(100000); + icp->Modified(); + vtkSmartPointer transform = vtkSmartPointer::New(); + transform = icp->GetLandmarkTransform(); + + vtkSmartPointer m = icp->GetMatrix(); + MITK_INFO << "The resulting matrix is: " << *m; + + vtkSmartPointer icpTransformFilter = + vtkSmartPointer::New(); + icpTransformFilter->SetInputData(movingSurface->GetVtkPolyData()); + icpTransformFilter->SetTransform(icp); + icpTransformFilter->Update(); + + movingSurface->SetVtkPolyData(icpTransformFilter->GetOutput()); + movingSurface->Modified(); + + MITK_INFO << "registration done"; + + return movingSurface; +} \ No newline at end of file diff --git a/Modules/SurfaceRegistration/src/mitkShapeComparisonManager.cpp b/Modules/SurfaceRegistration/src/mitkShapeComparisonManager.cpp index e018fc4cce..91ae70aa03 100644 --- a/Modules/SurfaceRegistration/src/mitkShapeComparisonManager.cpp +++ b/Modules/SurfaceRegistration/src/mitkShapeComparisonManager.cpp @@ -1,41 +1,46 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include #include - +#include mitk::ShapeComparisonManager::ShapeComparisonManager() { - } mitk::ShapeComparisonManager::~ShapeComparisonManager() { - } void mitk::ShapeComparisonManager::setMovingSurface(mitk::Surface::Pointer moving) { this->m_MovingSurface = moving; } void mitk::ShapeComparisonManager::setTargetSurface(mitk::Surface::Pointer target) { this->m_TargetSurface = target; } +mitk::DataNode::Pointer mitk::ShapeComparisonManager::manageICPCalculation(mitk::Surface::Pointer movingSurface, mitk::Surface::Pointer targetSurface) +{ + mitk::DataNode::Pointer registeredNode = mitk::DataNode::New(); + mitk::SurfaceRegistrationICP *registrationHelper = new SurfaceRegistrationICP(); + registrationHelper->CalculateICP(movingSurface, targetSurface); // rueckgabe + registeredNode->SetData(movingSurface); - + return registeredNode; +} \ No newline at end of file diff --git a/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/QmitkSurfaceRegistration.cpp b/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/QmitkSurfaceRegistration.cpp index 32d0e647a0..34c16b2f80 100644 --- a/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/QmitkSurfaceRegistration.cpp +++ b/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/QmitkSurfaceRegistration.cpp @@ -1,240 +1,225 @@ /*========================================================================= Program: Medical Imaging & Interaction Toolkit Language: C++ Date: $Date$ Version: $Revision$ Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #include "QmitkSurfaceRegistration.h" #include #include #include #include #include #include #include // Includes for image casting between ITK and MITK: added after using Plugin Generator #include // added for surface dynamic cast -#include +#include #include #include #include #include #include #include #include #include #include #include - const std::string QmitkSurfaceRegistration::VIEW_ID = "org.mitk.views.qmitksurfaceregistration"; QmitkSurfaceRegistration::QmitkSurfaceRegistration(QObject *parent) : m_ParentWidget(0), m_movingSurfaceNode(nullptr), m_targetSurfaceNode(nullptr) { } QmitkSurfaceRegistration::~QmitkSurfaceRegistration() { // delete pointer objects m_movingSurfaceNode = nullptr; m_targetSurfaceNode = nullptr; } // void QmitkSurfaceRegistration::SetFocus(){ m_Controls.groupBoxMoving->setFocus(); } void QmitkSurfaceRegistration::CreateQtPartControl(QWidget *parent) { // create GUI widgets from the Qt Designer's .ui file m_Controls.setupUi(parent); connect(m_Controls.pushButtonExecute, SIGNAL(clicked()), this, SLOT(doExecute())); mitk::RenderingManager::GetInstance()->SetDataStorage(this->GetDataStorageReference()->GetDataStorage()); mitk::RenderingManager::GetInstance()->InitializeViews(); m_ParentWidget = parent; } - void QmitkSurfaceRegistration::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList &nodes) { - MITK_INFO << "On Selection Changed"; bool rotationEnabled = false; - + if (nodes.empty()) { MITK_INFO << "Nothing selected yet"; m_Controls.labelSelectMovingSurface->setStyleSheet(" QLabel { color: rgb(255, 0, 0) }"); m_Controls.labelSelectTargetSurface->setStyleSheet(" QLabel { color: rgb(255, 0, 0) }"); m_Controls.labelMovingSurfaceName->setText(QString::fromStdString("No moving surface selected")); m_Controls.labelTargetSurfaceName->setText(QString::fromStdString("No target surface selected")); m_Controls.groupBoxMoving->setEnabled(true); m_Controls.groupBoxMappedData->setEnabled(false); if (m_useTestConfig) { m_Controls.pushButtonExecute->setEnabled(true); } else{ - m_Controls.pushButtonExecute->setEnabled(false); + m_Controls.pushButtonExecute->setEnabled(false); } m_Controls.radioButtonMirroring->setEnabled(false); return; } else { if (nodes.size() == 1) { if (nodes[0].IsNotNull() && dynamic_cast(nodes[0]->GetData())) { MITK_INFO << "There is exactly one image selected"; m_movingSurfaceNode = nodes[0]; m_Controls.labelSelectMovingSurface->setText("Selected moving surface:"); m_Controls.labelSelectMovingSurface->setStyleSheet(" QLabel { color: rgb(0, 0, 0) }"); m_Controls.labelMovingSurfaceName->setText( QString::fromStdString("File name: " + m_movingSurfaceNode->GetName())); m_Controls.radioButtonMirroring->setEnabled(true); m_Controls.groupBoxTarget->setEnabled(true); m_Controls.groupBoxMappedData->setEnabled(true); m_Controls.groupBoxTarget->setEnabled(true); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } else { QMessageBox::information(nullptr, "Warning", "Are you sure? - I dont think this is a Surface! Try again!"); } } else if (nodes.size() == 2) { if (nodes[1].IsNotNull() && dynamic_cast(nodes[1]->GetData())) { MITK_INFO << "There are two images selected"; m_targetSurfaceNode = nodes[1]; m_Controls.labelSelectTargetSurface->setText("Selected target surface:"); m_Controls.labelSelectTargetSurface->setStyleSheet(" QLabel { color: rgb(0, 0, 0) }"); m_Controls.labelTargetSurfaceName->setText( QString::fromStdString("File name: " + m_targetSurfaceNode->GetName())); m_Controls.textMappedDataName->setEnabled(true); m_Controls.pushButtonExecute->setEnabled(true); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); m_useTestConfig = false; } else { QMessageBox::information(nullptr, "Warning", "Are you sure? - I dont think this is a Surface!"); } } else { QMessageBox::information(nullptr, "Warning", "You do know that it only works with two surfaces, right? If you continue to click execute, this might crash one day!"); //wie kann ich die Auswahl zurueck setzen? } } } void QmitkSurfaceRegistration::doExecute() { - if (m_useTestConfig ) + if (m_useTestConfig) { mitk::StandaloneDataStorage::Pointer ds = mitk::StandaloneDataStorage::New(); mitk::IOUtil::Load("//ad/fs/E130-Projekte/BGLU/Fibula/Python/DataGAN/Registered/Surface/Tibia/tibia01_q0.stl", *ds); mitk::IOUtil::Load("//ad/fs/E130-Projekte/BGLU/Fibula/Python/DataGAN/Registered/Surface/Tibia/tibia02_q0.stl", *ds); m_movingSurfaceNode = ds->GetAll()->at(0); m_targetSurfaceNode = ds->GetAll()->at(1); this->GetDataStorageReference()->GetDataStorage()->Add(mitk::DataNode::Pointer(ds->GetAll()->at(0))); this->GetDataStorageReference()->GetDataStorage()->Add(mitk::DataNode::Pointer(ds->GetAll()->at(1))); this->GetDataStorageReference()->GetDataStorage()->Modified(); mitk::RenderingManager::GetInstance()->SetDataStorage(this->GetDataStorageReference()->GetDataStorage()); mitk::RenderingManager::GetInstance()->InitializeViews(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); m_Controls.pushButtonExecute->setEnabled(true); m_Controls.labelMovingSurfaceName->setText("tibia01_q0"); m_Controls.labelTargetSurfaceName->setText("tibia02_q0"); m_Controls.labelSelectMovingSurface->setText("Selected moving surface:"); - m_Controls.labelSelectMovingSurface->setStyleSheet(" QLabel { color: rgb(0, 0, 0) }"); + m_Controls.labelSelectMovingSurface->setStyleSheet(" QLabel { color: rgb(0, 0, 0) }"); m_Controls.labelSelectTargetSurface->setText("Selected target surface:"); m_Controls.labelSelectTargetSurface->setStyleSheet(" QLabel { color: rgb(0, 0, 0) }"); } MITK_INFO << "pushButtonExecute clicked"; - /*mitk::Surface *movingSurface = dynamic_cast(m_movingSurfaceNode); - mitk::Surface *targetSurface = dynamic_cast(m_targetSurfaceNode);*/ - /*auto manager = MitkShapeComparisonManager::New(); - manager->SetInput(0, dynamic_cast(m_movingSurfaceNode->GetData())); - manager->SetInput(1, dynamic_cast(m_targetSurfaceNode->GetData()));*/ performICPRegistration(); - } void QmitkSurfaceRegistration::performICPRegistration() { vtkSmartPointer icp = vtkSmartPointer::New(); icp->SetCheckMeanDistance(1); mitk::Surface::Pointer movingSurface = dynamic_cast (m_movingSurfaceNode->GetData()); mitk::Surface::Pointer targetSurface = dynamic_cast (m_targetSurfaceNode->GetData()); - icp->SetSource(movingSurface->GetVtkPolyData()); - icp->SetTarget(targetSurface->GetVtkPolyData()); - icp->SetMaximumNumberOfIterations(1000); - icp->SetMaximumMeanDistance(0.01); - icp->SetMeanDistanceModeToRMS(); - icp->StartByMatchingCentroidsOn(); - icp->SetMaximumNumberOfLandmarks(100000); - icp->Modified(); - vtkSmartPointer transform = vtkSmartPointer::New(); - transform = icp->GetLandmarkTransform(); - - - vtkSmartPointer m = icp->GetMatrix(); - MITK_INFO << "The resulting matrix is: " << *m; - - vtkSmartPointer icpTransformFilter = - vtkSmartPointer::New(); - icpTransformFilter->SetInputData(movingSurface->GetVtkPolyData()); - icpTransformFilter->SetTransform(icp); - icpTransformFilter->Update(); - + //icp->SetSource(movingSurface->GetVtkPolyData()); + //icp->SetTarget(targetSurface->GetVtkPolyData()); + //icp->SetMaximumNumberOfIterations(1000); + //icp->SetMaximumMeanDistance(0.01); + //icp->SetMeanDistanceModeToRMS(); + //icp->StartByMatchingCentroidsOn(); + //icp->SetMaximumNumberOfLandmarks(100000); + //icp->Modified(); + //vtkSmartPointer transform = vtkSmartPointer::New(); + //transform = icp->GetLandmarkTransform(); + + //vtkSmartPointer m = icp->GetMatrix(); + //MITK_INFO << "The resulting matrix is: " << *m; + + //vtkSmartPointer icpTransformFilter = + // vtkSmartPointer::New(); + //icpTransformFilter->SetInputData(movingSurface->GetVtkPolyData()); + //icpTransformFilter->SetTransform(icp); + //icpTransformFilter->Update(); MITK_INFO << "The mean distance is: " << icp->GetMeanDistance(); - mitk::DataNode::Pointer registerdNodeA = mitk::DataNode::New(); - //registerdNodeA->SetData(icpTransformFilter->GetOutput()); - movingSurface->SetVtkPolyData(icpTransformFilter->GetOutput()); - movingSurface->Modified(); - registerdNodeA->SetData(movingSurface); - this->GetDataStorageReference()->GetDataStorage()->Add(registerdNodeA, m_movingSurfaceNode); - mitk::DataNode::Pointer registerdNodeB = mitk::DataNode::New(); - registerdNodeB->SetData(targetSurface); - this->GetDataStorageReference()->GetDataStorage()->Add(registerdNodeB, m_targetSurfaceNode); - - registerdNodeA->SetName("Moving"); - registerdNodeB->SetName("Target"); + mitk::DataNode::Pointer registeredNode = mitk::DataNode::New(); + //registerdNodeA->SetData(icpTransformFilter->GetOutput()); + /* movingSurface->SetVtkPolyData(icpTransformFilter->GetOutput()); + movingSurface->Modified();*/ + mitk::ShapeComparisonManager *manager = new mitk::ShapeComparisonManager(); + registeredNode = manager->manageICPCalculation(movingSurface, targetSurface); + //registerdNodeA->SetData(movingSurface); + this->GetDataStorageReference()->GetDataStorage()->Add(registeredNode, m_movingSurfaceNode); + + registeredNode->SetName("Moving"); this->GetDataStorageReference()->GetDataStorage()->Modified(); mitk::RenderingManager::GetInstance()->InitializeViews(); - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); MITK_INFO << "registration done"; - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); -} +} \ No newline at end of file diff --git a/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/QmitkSurfaceRegistration.h b/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/QmitkSurfaceRegistration.h index 9eafc89124..7f4a5a320b 100644 --- a/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/QmitkSurfaceRegistration.h +++ b/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/QmitkSurfaceRegistration.h @@ -1,105 +1,103 @@ /*========================================================================= Program: Medical Imaging & Interaction Toolkit Language: C++ Date: $Date$ Version: $Revision$ Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #ifndef QmitkSurfaceRegistration_h #define QmitkSurfaceRegistration_h #include #ifdef WIN32 #pragma warning( disable : 4250 ) #endif - #include "QVTKWidget.h" #include "QmitkRegisterClasses.h" #include #include "ui_SurfaceRegistrationControls.h" #include "usServiceRegistration.h" /*! @brief QmitkSurfaceRegistrationView \warning This class is not yet documented. Use "git blame" and ask the author to provide basic documentation. \sa QmitkFunctionality \ingroup ${plugin_target}_internal */ class QmitkSurfaceRegistration : public QmitkAbstractView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) private: Q_OBJECT public: /*! @brief Constructor. Called by SampleApp (or other apps that use functionalities) */ QmitkSurfaceRegistration(QObject *parent = 0); virtual ~QmitkSurfaceRegistration(); static const std::string VIEW_ID; virtual void CreateQtPartControl(QWidget *parent); virtual void SetFocus() override; ///*! //@brief Creates the Qt connections needed //*/ QWidget* GetControls(); /// @brief Called when the user clicks the GUI button protected slots: void doExecute(); protected: // /*! //@brief called by QmitkFunctionality when DataManager's selection has changed // */ void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; - private: /*! * The parent QWidget */ QWidget* m_ParentWidget; /*! * @brief A pointer to the node of the moving surface. */ mitk::DataNode::Pointer m_movingSurfaceNode; /*! * @brief A pointer to the node of the target surface. */ mitk::DataNode::Pointer m_targetSurfaceNode; Ui::SurfaceRegistrationControls m_Controls; bool m_useTestConfig = true; void performICPRegistration(); }; #endif // QmitkSurfaceRegistration_h \ No newline at end of file