diff --git a/Modules/ModuleList.cmake b/Modules/ModuleList.cmake index 83aff98ce9..043bb9481d 100644 --- a/Modules/ModuleList.cmake +++ b/Modules/ModuleList.cmake @@ -1,80 +1,80 @@ # The entries in the mitk_modules list must be # ordered according to their dependencies. set(MITK_MODULES Core CommandLine AppUtil DCMTesting RDF LegacyIO DataTypesExt Annotation LegacyGL AlgorithmsExt MapperExt DICOMReader DICOMReaderServices DICOMTesting SceneSerializationBase PlanarFigure ImageDenoising ImageExtraction SceneSerialization Gizmo GraphAlgorithms Multilabel ImageStatistics ContourModel SurfaceInterpolation Segmentation PlanarFigureSegmentation QtWidgets QtWidgetsExt Chart SegmentationUI Classification GPGPU OpenIGTLink IGTBase IGT CameraCalibration OpenCL OpenCVVideoSupport QtOverlays ToFHardware ToFProcessing ToFUI PhotoacousticsHardware PhotoacousticsAlgorithms PhotoacousticsLib US USUI DicomUI Remeshing Python QtPython Persistence OpenIGTLinkUI IGTUI DicomRT RTUI IOExt XNAT TubeGraph BiophotonicsHardware MatchPointRegistration MatchPointRegistrationUI DiffusionImaging TumorInvasionAnalysis BoundingShape RenderWindowManager RenderWindowManagerUI CEST SurfaceRegistration - + ShapeComparison ) if(MITK_ENABLE_PIC_READER) list(APPEND MITK_MODULES IpPicSupportIO) endif() diff --git a/Modules/ShapeComparison/CMakeLists.txt b/Modules/ShapeComparison/CMakeLists.txt new file mode 100644 index 0000000000..f3f66c3419 --- /dev/null +++ b/Modules/ShapeComparison/CMakeLists.txt @@ -0,0 +1,4 @@ +mitk_create_module( ShapeComparison + INCLUDE_DIRS PRIVATE src/DataManagement src/Interactions src/IO src/Rendering + DEPENDS MitkCore + ) diff --git a/Modules/ShapeComparison/files.cmake b/Modules/ShapeComparison/files.cmake new file mode 100644 index 0000000000..ae8021f0fc --- /dev/null +++ b/Modules/ShapeComparison/files.cmake @@ -0,0 +1,10 @@ +file(GLOB_RECURSE H_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/include/*") + +set(CPP_FILES + mitkShapeComparisonManager.cpp + DataManagement/mitkLabelOverlapMetricCalculator.cpp +) + +set(RESOURCE_FILES +) + diff --git a/Modules/SurfaceRegistration/files.cmake b/Modules/SurfaceRegistration/files.cmake index 3dc367685f..74628942f2 100644 --- a/Modules/SurfaceRegistration/files.cmake +++ b/Modules/SurfaceRegistration/files.cmake @@ -1,13 +1,14 @@ file(GLOB_RECURSE H_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/include/*") set(CPP_FILES - mitkShapeComparisonManager.cpp + mitkSurfaceRegistrationManager.cpp + DataManagement/mitkShapeComparisonUtil.cpp DataManagement/mitkShortestDistanceCalculator.cpp DataManagement/mitkSurfaceRegistrationICP.cpp DataManagement/mitkSurfaceMirroringHelper.cpp DataManagement/mitkConvexHullCalculator.cpp ) set(RESOURCE_FILES ) diff --git a/Modules/SurfaceRegistration/include/MitkSurfaceRegistrationManager.h b/Modules/SurfaceRegistration/include/MitkSurfaceRegistrationManager.h index 6959a38028..353f16da0d 100644 --- a/Modules/SurfaceRegistration/include/MitkSurfaceRegistrationManager.h +++ b/Modules/SurfaceRegistration/include/MitkSurfaceRegistrationManager.h @@ -1,84 +1,86 @@ /*=================================================================== 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 mitkSurfaceRegistrationManager_h #define mitkSurfaceRegistrationManager_h #include "mitkSurface.h" #include #include "mitkDataNode.h" #include #include #include #include #include #include #include #include #include #include namespace mitk { class MITKSURFACEREGISTRATION_EXPORT SurfaceRegistrationManager { public: SurfaceRegistrationManager(mitk::Surface::Pointer moving, mitk::Surface::Pointer target); ~SurfaceRegistrationManager(); mitk::Surface::Pointer performRegistration(); void performComparison(); vtkSmartPointer getTable(); mitk::DataNode::Pointer getColourTransformedDataNode(); void setMirroring(bool mirroring); bool getMirroring(); mitk::Surface::Pointer getRegisteredSurface(); - + std::map getDistanceResults(); private: void manageICPCalculation(); void manageCalculateDistances(); void createLookUpTable(); void printPoints(mitk::Surface::Pointer surfaceA, mitk::Surface::Pointer surfaceB);//for test purposes --> CPD mitk::Surface::Pointer m_MovingSurface; mitk::Surface::Pointer m_TargetSurface; mitk::Surface::Pointer m_RegisteredSurface; mitk::Surface::Pointer m_MirroredSurface; ShortestDistanceCalculator *m_DistanceCalculator; vtkSmartPointer m_LookupTable; bool m_Mirroring = false; + std::map m_DistanceResults; + }; } #endif diff --git a/Modules/SurfaceRegistration/include/mitkShortestDistanceCalculator.h b/Modules/SurfaceRegistration/include/mitkShortestDistanceCalculator.h index f8694c4760..e8152bbee0 100644 --- a/Modules/SurfaceRegistration/include/mitkShortestDistanceCalculator.h +++ b/Modules/SurfaceRegistration/include/mitkShortestDistanceCalculator.h @@ -1,64 +1,68 @@ /*=================================================================== 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 #include #include namespace mitk{ class ShortestDistanceCalculator { public: ShortestDistanceCalculator(vtkSmartPointer moving, vtkSmartPointer target); ~ShortestDistanceCalculator(); void calculateShortestDistance(); void calculateCurvature(); double getDistanceRange(); double getRangeMin(); double getRangeMax(); double getMean(); double getStandardDeviation(); - + std::map getResults(); + vtkSmartPointer getDistances(); protected: void setDistances(vtkSmartPointer distances); void setRangeMin(double rangeMin); void setRangeMax(double rangeMax); void setMean(double mean); void setStandardDeviation(double std); double calculateVariance(double mean, int pointSetSize) const; private: vtkSmartPointer m_Distances; vtkSmartPointer m_Moving; vtkSmartPointer m_Target; double m_RangeMin; double m_RangeMax; double m_Mean; double m_StandardDeviation; + std::map m_Results; + + }; }; #endif \ No newline at end of file diff --git a/Modules/SurfaceRegistration/src/DataManagement/MitkShortestDistanceCalculator.cpp b/Modules/SurfaceRegistration/src/DataManagement/MitkShortestDistanceCalculator.cpp index 2bb3ba5bdb..6504d8d503 100644 --- a/Modules/SurfaceRegistration/src/DataManagement/MitkShortestDistanceCalculator.cpp +++ b/Modules/SurfaceRegistration/src/DataManagement/MitkShortestDistanceCalculator.cpp @@ -1,251 +1,259 @@ /*=================================================================== 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 "vtkCellLocator.h" #include "vtkPointData.h" #include "vtkImplicitPolyDataDistance.h" #include "vtkDoubleArray.h" #include #include #include #include #include #include #include #include #include #include #include #include // std::abs mitk::ShortestDistanceCalculator::ShortestDistanceCalculator(vtkSmartPointer moving, vtkSmartPointer target) { m_Moving = moving; m_Target = target; } mitk::ShortestDistanceCalculator::~ShortestDistanceCalculator() { m_Moving->Delete(); m_Target->Delete(); m_Distances->Delete(); } void mitk::ShortestDistanceCalculator::calculateShortestDistance() { MITK_INFO << "calculate shortest distance between cells ..."; m_Distances = vtkSmartPointer::New(); double fromPoint[3] = { 0, 0, 0 }; int pointSetSize = 0; double mean = 0; pointSetSize = m_Moving->GetPoints()->GetNumberOfPoints(); vtkSmartPointer implicitPolyDataDistance = vtkSmartPointer::New(); implicitPolyDataDistance->SetInput(m_Target); m_RangeMin = 0; m_RangeMax = 0; for (int i = 0; i < pointSetSize; ++i) { m_Moving->GetPoints()->GetPoint(i, fromPoint); double distance = implicitPolyDataDistance->FunctionValue(fromPoint[0], fromPoint[1], fromPoint[2]); m_Distances->InsertNextValue(distance); if (distance < m_RangeMin) { m_RangeMin = distance; } else if (distance > m_RangeMax) { m_RangeMax = distance; } - mean += distance; + mean += std::abs(distance); } m_Mean = mean / pointSetSize; m_StandardDeviation = std::sqrt(calculateVariance(m_Mean, pointSetSize)); - MITK_INFO << "Min Value is: " << m_RangeMin; - MITK_INFO << "Max Value is: " << m_RangeMax; - MITK_INFO << "The Mean is: " << m_Mean; - MITK_INFO << "STD: " << m_StandardDeviation; + + //fill result map + m_Results["Min"] = m_RangeMin; + m_Results["Max"] = m_RangeMax; + m_Results["Mean"] = m_Mean; + m_Results["Std"] = m_StandardDeviation; } void mitk::ShortestDistanceCalculator::calculateCurvature() { //vtkSmartPointer curvaturesFilter = TODO // vtkSmartPointer::New(); //curvaturesFilter->AddInputData(m_Target); ////curvaturesFilter->SetCurvatureTypeToMinimum(); ////curvaturesFilter->SetCurvatureTypeToMaximum(); ////curvaturesFilter->SetCurvatureTypeToGaussian(); //curvaturesFilter->SetCurvatureTypeToMean(); //curvaturesFilter->Update(); //double scalarRange[2]; // //curvaturesFilter->GetOutput()->GetScalarRange(scalarRange); //scalarRange[0] = -0.125; //scalarRange[1] = 0.125; // // Build a lookup table // vtkSmartPointer colorSeries = // vtkSmartPointer::New(); // int scheme = 16; // colorSeries->SetColorScheme(scheme); // std::cout << "Using color scheme #: " // << colorSeries->GetColorScheme() << " is " // << colorSeries->GetColorSchemeName() << std::endl; // vtkSmartPointer lut = // vtkSmartPointer::New(); // lut->SetColorSpaceToHSV(); // // Use a color series to create a transfer function // int numColors = colorSeries->GetNumberOfColors(); // for (int i = 0; i < numColors; i++) // { // vtkColor3ub color = colorSeries->GetColor(i); // double dColor[3]; // dColor[0] = static_cast (color[0]) / 255.0; // dColor[1] = static_cast (color[1]) / 255.0; // dColor[2] = static_cast (color[2]) / 255.0; // double t = scalarRange[0] + (scalarRange[1] - scalarRange[0]) // / (numColors - 1) * i; // lut->AddRGBPoint(t, dColor[0], dColor[1], dColor[2]); // } // // Create a mapper and actor // vtkSmartPointer mapper = // vtkSmartPointer::New(); // mapper->SetInputConnection(curvaturesFilter->GetOutputPort()); // mapper->SetLookupTable(lut); // mapper->SetScalarRange(scalarRange); // vtkSmartPointer actor = // vtkSmartPointer::New(); // actor->SetMapper(mapper); // // Create a scalar bar // vtkSmartPointer scalarBar = // vtkSmartPointer::New(); // scalarBar->SetLookupTable(mapper->GetLookupTable()); // scalarBar->SetTitle( // curvaturesFilter->GetOutput()->GetPointData()->GetScalars()->GetName()); // scalarBar->SetNumberOfLabels(5); // // Create a renderer, render window, and interactor // vtkSmartPointer renderer = // vtkSmartPointer::New(); // vtkSmartPointer renderWindow = // vtkSmartPointer::New(); // renderWindow->AddRenderer(renderer); // vtkSmartPointer renderWindowInteractor = // vtkSmartPointer::New(); // renderWindowInteractor->SetRenderWindow(renderWindow); // // Add the actors to the scene // renderer->AddActor(actor); // renderer->AddActor2D(scalarBar); // renderer->SetBackground(.1, .2, .3); // Background color blue // // Render and interact // renderWindow->Render(); // renderWindowInteractor->Start(); } +std::map mitk::ShortestDistanceCalculator::getResults() +{ + return m_Results; +} + double mitk::ShortestDistanceCalculator::getDistanceRange() { double value; if (std::abs(m_RangeMin) < std::abs(m_RangeMax)) { value = std::ceil(std::abs(m_RangeMax)); } else { value = std::ceil(std::abs(m_RangeMin)); } return value; } double mitk::ShortestDistanceCalculator::getRangeMin() { return m_RangeMin; } double mitk::ShortestDistanceCalculator::getRangeMax() { return m_RangeMax; } double mitk::ShortestDistanceCalculator::getMean() { return m_Mean; } double mitk::ShortestDistanceCalculator::getStandardDeviation() { return m_StandardDeviation; } vtkSmartPointer mitk::ShortestDistanceCalculator::getDistances() { return m_Distances; } void mitk::ShortestDistanceCalculator::setDistances(vtkSmartPointer distances) { this->m_Distances = distances; } void mitk::ShortestDistanceCalculator::setRangeMin(double rangeMin) { this->m_RangeMin = rangeMin; } void mitk::ShortestDistanceCalculator::setRangeMax(double rangeMax) { this->m_RangeMax = rangeMax; } void mitk::ShortestDistanceCalculator::setMean(double mean) { this->m_Mean = mean; } void mitk::ShortestDistanceCalculator::setStandardDeviation(double std) { m_StandardDeviation = std; } double mitk::ShortestDistanceCalculator::calculateVariance(double mean, int pointSetSize) const { double variance = 0.0; int counter = 0; for (int i = 0; i < pointSetSize; ++i) { - variance += (std::abs(m_Distances->GetValueReference(i))- mean)*(std::abs(m_Distances->GetValueReference(i)) - mean); + variance += 1; + //variance += (std::abs(m_Distances->GetValueReference(i))- mean)*(std::abs(m_Distances->GetValueReference(i)) - mean); TODO } variance = variance / (pointSetSize - 1); return variance; } diff --git a/Modules/SurfaceRegistration/src/mitkSurfaceRegistrationManager.cpp b/Modules/SurfaceRegistration/src/mitkSurfaceRegistrationManager.cpp index 62ffbca318..38e8d94870 100644 --- a/Modules/SurfaceRegistration/src/mitkSurfaceRegistrationManager.cpp +++ b/Modules/SurfaceRegistration/src/mitkSurfaceRegistrationManager.cpp @@ -1,214 +1,220 @@ /*=================================================================== 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 #include #include #include #include #include #include #include #include #include #include #include mitk::SurfaceRegistrationManager::SurfaceRegistrationManager(mitk::Surface::Pointer moving, mitk::Surface::Pointer target) { this->m_MovingSurface = moving; this->m_TargetSurface = target; this->m_Mirroring = false; createLookUpTable(); } mitk::SurfaceRegistrationManager::~SurfaceRegistrationManager() { m_MovingSurface->Delete(); m_TargetSurface->Delete(); m_RegisteredSurface->Delete(); m_LookupTable->Delete(); } mitk::Surface::Pointer mitk::SurfaceRegistrationManager::performRegistration() { if (m_Mirroring) { MitkSurfaceMirroringHelper *mirroringHelper = new MitkSurfaceMirroringHelper(); m_MirroredSurface = mirroringHelper->performMirroring(m_MovingSurface); } //printPoints(); //after mirroring manageICPCalculation(); //printPoints(); //printPoints(m_RegisteredSurface, m_TargetSurface); //after mirroring //mitk::IOUtil::Save(m_RegisteredSurface, "testRegistered.stl"); //mitk::IOUtil::Save(m_TargetSurface, "testTarget.stl"); return m_RegisteredSurface; } void mitk::SurfaceRegistrationManager::performComparison() { if (m_Mirroring) { MitkSurfaceMirroringHelper *mirroringHelper = new MitkSurfaceMirroringHelper(); m_MirroredSurface = mirroringHelper->performMirroring(m_MovingSurface); } manageCalculateDistances(); } vtkSmartPointer mitk::SurfaceRegistrationManager::getTable() { return m_LookupTable; } mitk::DataNode::Pointer mitk::SurfaceRegistrationManager::getColourTransformedDataNode() { mitk::Surface::Pointer currentSurface; if (m_RegisteredSurface != nullptr) { currentSurface = m_RegisteredSurface; } else if(m_MirroredSurface!= nullptr) { currentSurface = m_MirroredSurface; } else { currentSurface = m_MovingSurface; } currentSurface->GetVtkPolyData()->GetPointData()->SetScalars(m_DistanceCalculator->getDistances()); currentSurface->GetVtkPolyData()->GetPointData()->Update(); //convert m_LookUpTable to mitk LookUpTable mitk::LookupTable::Pointer lut = mitk::LookupTable::New(); lut->SetVtkLookupTable(m_LookupTable); mitk::LookupTableProperty::Pointer prop = mitk::LookupTableProperty::New(lut); currentSurface->GetVtkPolyData()->GetPointData()->Update(); mitk::DataNode::Pointer transformedNode = mitk::DataNode::New(); transformedNode->SetProperty("LookupTable", prop); transformedNode->SetBoolProperty("scalar visibility", true); transformedNode->SetBoolProperty("color mode", true); //set Range of Lut double range = m_DistanceCalculator->getDistanceRange(); - transformedNode->SetFloatProperty("ScalarsRangeMinimum", range*-1); - transformedNode->SetFloatProperty("ScalarsRangeMaximum", range); - //transformedNode->SetFloatProperty("ScalarsRangeMinimum", -5); - //transformedNode->SetFloatProperty("ScalarsRangeMaximum", 5); + //transformedNode->SetFloatProperty("ScalarsRangeMinimum", range*-1); + //transformedNode->SetFloatProperty("ScalarsRangeMaximum", range); + transformedNode->SetFloatProperty("ScalarsRangeMinimum", -3.5); + transformedNode->SetFloatProperty("ScalarsRangeMaximum", 3.5); // Configure material so that only scalar colors are shown transformedNode->SetColor(1.0f, 1.0f, 1.0f); transformedNode->SetOpacity(1.0f); transformedNode->SetFloatProperty("material.wireframeLineWidth", 2.0f); //Set view of plane to VTK_SURFACE transformedNode->SetProperty("material.representation", mitk::VtkRepresentationProperty::New());//VTK_SURFACE currently default // save colored surface node transformedNode->SetData(currentSurface); return transformedNode; } void mitk::SurfaceRegistrationManager::setMirroring(bool mirroring) { this->m_Mirroring = mirroring; } bool mitk::SurfaceRegistrationManager::getMirroring() { return m_Mirroring; } mitk::Surface::Pointer mitk::SurfaceRegistrationManager::getRegisteredSurface() { return m_RegisteredSurface; } +std::map mitk::SurfaceRegistrationManager::getDistanceResults() +{ + return m_DistanceResults; +} + void mitk::SurfaceRegistrationManager::manageICPCalculation() { MITK_INFO << "Starting registration"; m_RegisteredSurface = mitk::Surface::New(); mitk::SurfaceRegistrationICP *registrationHelper = new SurfaceRegistrationICP(); if (m_Mirroring) { m_RegisteredSurface = registrationHelper->CalculateICP(m_MirroredSurface, m_TargetSurface); } else { m_RegisteredSurface = registrationHelper->CalculateICP(m_MovingSurface, m_TargetSurface); } } void mitk::SurfaceRegistrationManager::manageCalculateDistances() { if (m_RegisteredSurface != nullptr) { m_DistanceCalculator = new ShortestDistanceCalculator(m_RegisteredSurface->GetVtkPolyData(), m_TargetSurface->GetVtkPolyData()); } else if(m_Mirroring) { m_DistanceCalculator = new ShortestDistanceCalculator(m_MirroredSurface->GetVtkPolyData(), m_TargetSurface->GetVtkPolyData()); } else { m_DistanceCalculator = new ShortestDistanceCalculator(m_MovingSurface->GetVtkPolyData(), m_TargetSurface->GetVtkPolyData()); } m_DistanceCalculator->calculateShortestDistance(); - m_DistanceCalculator->calculateCurvature(); + //m_DistanceCalculator->calculateCurvature(); TODO + m_DistanceResults = m_DistanceCalculator->getResults(); } void mitk::SurfaceRegistrationManager::createLookUpTable() { m_LookupTable = vtkSmartPointer::New(); m_LookupTable->SetNumberOfTableValues(25); m_LookupTable->Build(); } void mitk::SurfaceRegistrationManager::printPoints(mitk::Surface::Pointer surfaceA, mitk::Surface::Pointer surfaceB) { MITK_INFO << "printing Points"; std::ofstream OutputFileMoving; OutputFileMoving.open("movingPoints.txt"); int pointNumber = surfaceA->GetVtkPolyData()->GetPoints()->GetNumberOfPoints(); double printPoint[3] = { 0,0,0 }; for (int i = 0; i < pointNumber; ++i) { surfaceA->GetVtkPolyData()->GetPoints()->GetPoint(i, printPoint); OutputFileMoving << printPoint[0]<<" " << printPoint[1] << " " << printPoint[2] <GetVtkPolyData()->GetPoints()->GetNumberOfPoints(); double printPoint2[3] = { 0,0,0 }; for (int i = 0; i < pointNumber2; ++i) { surfaceB->GetVtkPolyData()->GetPoints()->GetPoint(i, printPoint2); OutputFileTarget << printPoint2[0] << " " << printPoint2[1] << " " << printPoint2[2] << std::endl; } OutputFileTarget.close(); } \ No newline at end of file diff --git a/Plugins/PluginList.cmake b/Plugins/PluginList.cmake index 6cc3ea349a..6f48963d63 100644 --- a/Plugins/PluginList.cmake +++ b/Plugins/PluginList.cmake @@ -1,102 +1,104 @@ # Plug-ins must be ordered according to their dependencies set(MITK_PLUGINS org.blueberry.core.runtime:ON org.blueberry.core.expressions:OFF org.blueberry.core.commands:OFF org.blueberry.core.jobs:OFF org.blueberry.ui.qt:OFF org.blueberry.ui.qt.help:ON org.blueberry.ui.qt.log:ON org.blueberry.ui.qt.objectinspector:OFF #org.blueberry.test:ON #org.blueberry.uitest:ON #Testing/org.blueberry.core.runtime.tests:ON #Testing/org.blueberry.osgi.tests:ON org.mitk.core.services:ON org.mitk.gui.common:ON org.mitk.planarfigure:ON org.mitk.core.ext:OFF org.mitk.core.jobs:OFF org.mitk.gui.qt.application:ON org.mitk.gui.qt.coreapplication:OFF org.mitk.gui.qt.ext:OFF org.mitk.gui.qt.extapplication:OFF org.mitk.gui.qt.common:ON org.mitk.gui.qt.stdmultiwidgeteditor:ON org.mitk.gui.qt.common.legacy:OFF org.mitk.gui.qt.cmdlinemodules:OFF org.mitk.gui.qt.diffusionimagingapp:OFF org.mitk.gui.qt.datamanager:ON org.mitk.gui.qt.datamanagerlight:OFF org.mitk.gui.qt.properties:ON org.mitk.gui.qt.basicimageprocessing:OFF org.mitk.gui.qt.dicom:OFF org.mitk.gui.qt.dicominspector:OFF org.mitk.gui.qt.diffusionimaging:OFF org.mitk.gui.qt.diffusionimaging.connectomics:OFF org.mitk.gui.qt.diffusionimaging.denoising:OFF org.mitk.gui.qt.diffusionimaging.fiberfox:OFF org.mitk.gui.qt.diffusionimaging.fiberprocessing:OFF org.mitk.gui.qt.diffusionimaging.ivim:OFF org.mitk.gui.qt.diffusionimaging.odfpeaks:OFF org.mitk.gui.qt.diffusionimaging.partialvolume:OFF org.mitk.gui.qt.diffusionimaging.preprocessing:OFF org.mitk.gui.qt.diffusionimaging.reconstruction:OFF org.mitk.gui.qt.diffusionimaging.registration:OFF org.mitk.gui.qt.diffusionimaging.tbss:OFF org.mitk.gui.qt.diffusionimaging.tractography:OFF org.mitk.gui.qt.dosevisualization:OFF org.mitk.gui.qt.geometrytools:OFF org.mitk.gui.qt.igtexamples:OFF org.mitk.gui.qt.igttracking:OFF org.mitk.gui.qt.lasercontrol:OFF org.mitk.gui.qt.openigtlink:OFF org.mitk.gui.qt.imagecropper:OFF org.mitk.gui.qt.imagenavigator:ON org.mitk.gui.qt.viewnavigator:OFF org.mitk.gui.qt.materialeditor:OFF org.mitk.gui.qt.measurementtoolbox:OFF org.mitk.gui.qt.moviemaker:OFF org.mitk.gui.qt.pointsetinteraction:OFF org.mitk.gui.qt.pointsetinteractionmultispectrum:OFF org.mitk.gui.qt.python:OFF org.mitk.gui.qt.remeshing:OFF org.mitk.gui.qt.segmentation:OFF org.mitk.gui.qt.aicpregistration:OFF org.mitk.gui.qt.renderwindowmanager:OFF org.mitk.gui.qt.toftutorial:OFF org.mitk.gui.qt.tofutil:OFF org.mitk.gui.qt.tubegraph:OFF org.mitk.gui.qt.ugvisualization:OFF org.mitk.gui.qt.photoacoustics.pausviewer:OFF org.mitk.gui.qt.photoacoustics.imageprocessing:OFF org.mitk.gui.qt.photoacoustics.simulation:OFF org.mitk.gui.qt.ultrasound:OFF org.mitk.gui.qt.volumevisualization:OFF org.mitk.gui.qt.eventrecorder:OFF org.mitk.gui.qt.xnat:OFF org.mitk.gui.qt.igt.app.echotrack:OFF org.mitk.gui.qt.spectrocamrecorder:OFF org.mitk.gui.qt.classificationsegmentation:OFF org.mitk.gui.qt.overlaymanager:OFF org.mitk.gui.qt.igt.app.hummelprotocolmeasurements:OFF org.mitk.gui.qt.multilabelsegmentation:OFF org.mitk.matchpoint.core.helper:OFF org.mitk.gui.qt.matchpoint.algorithm.browser:OFF org.mitk.gui.qt.matchpoint.algorithm.control:OFF org.mitk.gui.qt.matchpoint.algorithm.batch:OFF org.mitk.gui.qt.matchpoint.mapper:OFF org.mitk.gui.qt.matchpoint.framereg:OFF org.mitk.gui.qt.matchpoint.visualizer:OFF org.mitk.gui.qt.matchpoint.evaluator:OFF org.mitk.gui.qt.matchpoint.manipulator:OFF org.mitk.gui.qt.cest:OFF org.mitk.gui.qt.exampleplugin:OFF org.mitk.gui.qt.surfaceregistration:OFF + org.mitk.gui.qt.shapecomparison:OFF + org.mitk.gui.qt.shapemodelutil:OFF ) diff --git a/Plugins/org.mitk.gui.qt.shapecomparison/CMakeLists.txt b/Plugins/org.mitk.gui.qt.shapecomparison/CMakeLists.txt new file mode 100644 index 0000000000..e0f8b94fce --- /dev/null +++ b/Plugins/org.mitk.gui.qt.shapecomparison/CMakeLists.txt @@ -0,0 +1,8 @@ +project(org_mitk_gui_qt_shapecomparison) + +mitk_create_plugin( + EXPORT_DIRECTIVE MITK_QT_SHAPECOMPARISON + EXPORTED_INCLUDE_SUFFIXES src + MODULE_DEPENDS MitkQtWidgetsExt MitkShapeComparison MitkSceneSerialization MitkChart +) + diff --git a/Plugins/org.mitk.gui.qt.shapecomparison/documentation/doxygen/modules.dox b/Plugins/org.mitk.gui.qt.shapecomparison/documentation/doxygen/modules.dox new file mode 100644 index 0000000000..89ff4bc555 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.shapecomparison/documentation/doxygen/modules.dox @@ -0,0 +1,16 @@ +/** + \defgroup org_mitk_gui_qt_surfaceregistration org.mitk.gui.qt.surfaceregistration + \ingroup MITKPlugins + + \brief TODO + +*/ + +/** + \defgroup org_mitk_gui_qt_surfaceregistration_internal Internal + \ingroup org_mitk_gui_qt_surfaceregistration + + \brief This subcategory includes the internal classes of the org.mitk.gui.qt.surfaceregistration plugin. Other + plugins must not rely on these classes. They contain implementation details and their interface + may change at any time. We mean it. +*/ \ No newline at end of file diff --git a/Plugins/org.mitk.gui.qt.surfaceregistration/files.cmake b/Plugins/org.mitk.gui.qt.shapecomparison/files.cmake similarity index 61% copy from Plugins/org.mitk.gui.qt.surfaceregistration/files.cmake copy to Plugins/org.mitk.gui.qt.shapecomparison/files.cmake index 9be9068c28..8d55ea902b 100644 --- a/Plugins/org.mitk.gui.qt.surfaceregistration/files.cmake +++ b/Plugins/org.mitk.gui.qt.shapecomparison/files.cmake @@ -1,36 +1,35 @@ set(SRC_CPP_FILES ) set(INTERNAL_CPP_FILES - org_mitk_gui_qt_surfaceregistration_Activator.cpp - QmitkSurfaceRegistration.cpp + org_mitk_gui_qt_shapecomparison_Activator.cpp + QmitkShapeComparison.cpp ) set(UI_FILES - src/internal/SurfaceRegistrationControls.ui + src/internal/ShapeComparisonControls.ui ) set(MOC_H_FILES - src/internal/org_mitk_gui_qt_surfaceregistration_Activator.h - src/internal/QmitkSurfaceRegistration.h + src/internal/org_mitk_gui_qt_shapecomparison_Activator.h + src/internal/QmitkShapeComparison.h ) set(CACHED_RESOURCE_FILES resources/icon.png plugin.xml ) set(QRC_FILES - #resources/imagecropper.qrc ) set(CPP_FILES) foreach(file ${SRC_CPP_FILES}) set(CPP_FILES ${CPP_FILES} src/${file}) endforeach(file ${SRC_CPP_FILES}) foreach(file ${INTERNAL_CPP_FILES}) set(CPP_FILES ${CPP_FILES} src/internal/${file}) endforeach(file ${INTERNAL_CPP_FILES}) diff --git a/Plugins/org.mitk.gui.qt.shapecomparison/manifest_headers.cmake b/Plugins/org.mitk.gui.qt.shapecomparison/manifest_headers.cmake new file mode 100644 index 0000000000..8d5b4edaf2 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.shapecomparison/manifest_headers.cmake @@ -0,0 +1,5 @@ +set(Plugin-Name "MITK Shape Comparison") +set(Plugin-Version "1.0.0") +set(Plugin-Vendor "DKFZ, Medical and Biological Informatics") +set(Plugin-ContactAddress "http://www.mitk.org") +set(Require-Plugin org.mitk.gui.qt.common) \ No newline at end of file diff --git a/Plugins/org.mitk.gui.qt.shapecomparison/plugin.xml b/Plugins/org.mitk.gui.qt.shapecomparison/plugin.xml new file mode 100644 index 0000000000..fe2b7623d0 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.shapecomparison/plugin.xml @@ -0,0 +1,20 @@ + + + + + + + Please describe + + + + + + diff --git a/Plugins/org.mitk.gui.qt.shapecomparison/src/internal/QmitkShapeComparison.cpp b/Plugins/org.mitk.gui.qt.shapecomparison/src/internal/QmitkShapeComparison.cpp index 96edf1ab55..19b707d4bc 100644 --- a/Plugins/org.mitk.gui.qt.shapecomparison/src/internal/QmitkShapeComparison.cpp +++ b/Plugins/org.mitk.gui.qt.shapecomparison/src/internal/QmitkShapeComparison.cpp @@ -1,402 +1,421 @@ /*========================================================================= 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 "QmitkShapeComparison.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include "org_mitk_gui_qt_shapecomparison_Activator.h" #include #include #include #include #include #include #include #include #include #include #include #include #include const std::string QmitkShapeComparison::VIEW_ID = "org.mitk.views.shapecomparison"; QmitkShapeComparison::QmitkShapeComparison(QObject *parent) : m_ParentWidget(0) { } QmitkShapeComparison::~QmitkShapeComparison() { } QWidget * QmitkShapeComparison::GetControls() { return nullptr; } void QmitkShapeComparison::CreateQtPartControl(QWidget *parent) { // create GUI widgets from the Qt Designer's .ui file m_Controls.setupUi(parent); m_Controls.firstImageNameComboBox->SetDataStorage(this->GetDataStorage()); m_Controls.firstImageNameComboBox->SetPredicate(mitk::NodePredicateAnd::New( mitk::TNodePredicateDataType::New(), mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("helper object")))); m_Controls.secondImageNameComboBox->SetDataStorage(this->GetDataStorage()); m_Controls.secondImageNameComboBox->SetPredicate(mitk::NodePredicateAnd::New( mitk::TNodePredicateDataType::New(), mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("helper object")))); m_Controls.selectGeometryImgComboBox->SetDataStorage(this->GetDataStorage()); m_Controls.selectGeometryImgComboBox->SetPredicate(mitk::NodePredicateAnd::New( mitk::TNodePredicateDataType::New(), mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("helper object")))); connect(m_Controls.comparePushButton, SIGNAL(clicked()), this, SLOT(compare())); connect(m_Controls.firstImageNameComboBox, SIGNAL(OnSelectionChanged(const mitk::DataNode *)), this, SLOT(OnSelectedFirstImgChanged(const mitk::DataNode *))); connect(m_Controls.secondImageNameComboBox, SIGNAL(OnSelectionChanged(const mitk::DataNode *)), this, SLOT(OnSelectedSecondImgChanged(const mitk::DataNode *))); m_Controls.comparePushButton->setEnabled(true); mitk::RenderingManager::GetInstance()->SetDataStorage(this->GetDataStorageReference()->GetDataStorage()); mitk::RenderingManager::GetInstance()->InitializeViews(); m_ParentWidget = parent; } void QmitkShapeComparison::SetFocus() { } void QmitkShapeComparison::OnSelectedFirstImgChanged(const mitk::DataNode *node) { if (node != nullptr) { m_firstImg = dynamic_cast(node->GetData()); m_Controls.selectFirstImageLabel->setText("Selected first Image:"); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); if (m_secondImg != nullptr && m_secondImg.GetPointer() != m_firstImg.GetPointer()) { m_Controls.comparePushButton->setEnabled(true); } } } void QmitkShapeComparison::OnSelectedSecondImgChanged(const mitk::DataNode *node) { if (node != nullptr) { m_secondImg = dynamic_cast(node->GetData()); m_Controls.selectSecondImageLabel->setText("Selected second Image:"); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); if (m_firstImg != nullptr && m_secondImg.GetPointer() != m_secondImg.GetPointer()) { m_Controls.comparePushButton->setEnabled(true); } } } void QmitkShapeComparison::compare() { MITK_INFO << "compare clicked!"; mitk::Image* img = dynamic_cast(m_Controls.firstImageNameComboBox->GetSelectedNode()->GetData()); - int sliceNumber = 120; - //double spacingX = img->GetGeometry()->GetSpacing()[0]; positive vlaue - //double spacingY = img->GetGeometry()->GetSpacing()[1]; - //double spacingZ = img->GetGeometry()->GetSpacing()[2]; - std::array spacing = { -0.47499999999999992, 0.47499999999999992, 0.47500228881835938 }; - // std::array spacing = { spacingX, spacingY, spacingZ }; - double actualsliceNumber = sliceNumber * spacing[2]; - mitk::PlaneGeometry::Pointer planeT = mitk::PlaneGeometry::New(); - //plane->InitializeStandardPlane(256.0, 256.0, image->GetTimeGeometry()->GetGeometryForTimeStep(0)->GetSpacing(), mitk::PlaneGeometry::Axial, sliceNumber); - planeT->InitializeStandardPlane(256.0, 256.0, img->GetTimeGeometry()->GetGeometryForTimeStep(0)->GetSpacing()); - planeT->SetSpacing(mitk::Vector3D(spacing.data())); - mitk::Image::Pointer imgSlice = mitk::Image::New(); - planeT->SetOrigin(img->GetTimeGeometry()->GetGeometryForTimeStep(0)->GetOrigin()); - mitk::Point3D modOrigin; - modOrigin[0] = planeT->GetOrigin()[0]; - modOrigin[1] = planeT->GetOrigin()[1]; - modOrigin[2] = planeT->GetOrigin()[2] + actualsliceNumber; - planeT->SetOrigin(modOrigin); - mitk::ExtractSliceFilter::Pointer extractor = mitk::ExtractSliceFilter::New(); - extractor->SetInput(img); - extractor->SetWorldGeometry(planeT); - extractor->SetOutputDimensionality(2); - extractor->SetInPlaneResampleExtentByGeometry(true); - extractor->SetResliceTransformByGeometry(img->GetTimeGeometry()->GetGeometryForTimeStep(0)); - extractor->SetInterpolationMode(mitk::ExtractSliceFilter::RESLICE_NEAREST); - extractor->Update(); - imgSlice = extractor->GetOutput(); - - mitk::DataNode::Pointer testNode = mitk::DataNode::New(); - testNode->SetData(imgSlice); - testNode->SetVisibility(true); - testNode->SetName("TestImage"); - - this->GetDataStorage()->Add(testNode); - this->GetDataStorageReference()->GetDataStorage()->Modified(); + //int sliceNumber = 120; + ////double spacingX = img->GetGeometry()->GetSpacing()[0]; positive vlaue + ////double spacingY = img->GetGeometry()->GetSpacing()[1]; + ////double spacingZ = img->GetGeometry()->GetSpacing()[2]; + //std::array spacing = { -0.47499999999999992, 0.47499999999999992, 0.47500228881835938 }; + //// std::array spacing = { spacingX, spacingY, spacingZ }; + //double actualsliceNumber = sliceNumber * spacing[2]; + //mitk::PlaneGeometry::Pointer planeT = mitk::PlaneGeometry::New(); + ////plane->InitializeStandardPlane(256.0, 256.0, image->GetTimeGeometry()->GetGeometryForTimeStep(0)->GetSpacing(), mitk::PlaneGeometry::Axial, sliceNumber); + //planeT->InitializeStandardPlane(256.0, 256.0, img->GetTimeGeometry()->GetGeometryForTimeStep(0)->GetSpacing()); + //planeT->SetSpacing(mitk::Vector3D(spacing.data())); + //mitk::Image::Pointer imgSlice = mitk::Image::New(); + //planeT->SetOrigin(img->GetTimeGeometry()->GetGeometryForTimeStep(0)->GetOrigin()); + //mitk::Point3D modOrigin; + //modOrigin[0] = planeT->GetOrigin()[0]; + //modOrigin[1] = planeT->GetOrigin()[1]; + //modOrigin[2] = planeT->GetOrigin()[2] + actualsliceNumber; + //planeT->SetOrigin(modOrigin); + //mitk::ExtractSliceFilter::Pointer extractor = mitk::ExtractSliceFilter::New(); + //extractor->SetInput(img); + //extractor->SetWorldGeometry(planeT); + //extractor->SetOutputDimensionality(2); + //extractor->SetInPlaneResampleExtentByGeometry(true); + //extractor->SetResliceTransformByGeometry(img->GetTimeGeometry()->GetGeometryForTimeStep(0)); + //extractor->SetInterpolationMode(mitk::ExtractSliceFilter::RESLICE_NEAREST); + //extractor->Update(); + //imgSlice = extractor->GetOutput(); + + //mitk::DataNode::Pointer testNode = mitk::DataNode::New(); + //testNode->SetData(imgSlice); + //testNode->SetVisibility(true); + //testNode->SetName("TestImage"); + + //this->GetDataStorage()->Add(testNode); + //this->GetDataStorageReference()->GetDataStorage()->Modified(); // mitk::Image* img = dynamic_cast( m_Controls.firstImageNameComboBox->GetSelectedNode()->GetData()); ////Code for comparison mitk::ShapeComparisonManager *shapeComparisonManager = new mitk::ShapeComparisonManager(m_firstImg, m_secondImg); shapeComparisonManager->calculateMetrics(); std::map labelOverlapResults = shapeComparisonManager->getLabelOverlapResults(); //Results to Qstring m_Controls.labelFPR->setText(QString::number(labelOverlapResults["FPR"])); m_Controls.labelFNR->setText(QString::number(labelOverlapResults["FNR"])); m_Controls.labelDice->setText(QString::number(labelOverlapResults["Dice"])); m_Controls.labelJaccard->setText(QString::number(labelOverlapResults["Jaccard"])); m_Controls.labelVolumeSimilarity->setText(QString::number(labelOverlapResults["VolumeSimilarity"])); + + //Chart test + std::vector temperatureHD = { 1.8, 3.1}; + std::vector temperatureOslo = { -4.3, -4}; + m_Controls.DistanceTabWidget->AddData1D(temperatureHD, "Heidelberg"); + m_Controls.DistanceTabWidget->AddData1D(temperatureOslo, "Oslo"); + m_Controls.DistanceTabWidget->SetChartType("Heidelberg", QmitkChartWidget::ChartType::line); + m_Controls.DistanceTabWidget->SetChartType("Oslo", QmitkChartWidget::ChartType::line); + m_Controls.DistanceTabWidget->SetXAxisLabel("month"); + m_Controls.DistanceTabWidget->SetYAxisLabel("temperature"); + m_Controls.DistanceTabWidget->Show(); + + //TODO remove + m_Controls.LabelOverlapTabWidget->AddData1D(std::vector{(labelOverlapResults["FPR"])}, "FPR", QmitkChartWidget::ChartType::bar); + m_Controls.LabelOverlapTabWidget->AddData1D(std::vector{(labelOverlapResults["FNR"])}, "FNR", QmitkChartWidget::ChartType::bar); + m_Controls.LabelOverlapTabWidget->AddData1D(std::vector{(labelOverlapResults["Jaccard"])}, "Jaccard", QmitkChartWidget::ChartType::bar); + m_Controls.LabelOverlapTabWidget->AddData1D(std::vector{(labelOverlapResults["Dice"])}, "Dice", QmitkChartWidget::ChartType::bar); + m_Controls.LabelOverlapTabWidget->baseSize(); + m_Controls.LabelOverlapTabWidget->Show(); //// // careful //testloadPosition(); iteratePlanePosition(axial); // //iteratePlanePosition(coronal); // // iteratePlanePosition(saggital); } void QmitkShapeComparison::reloadDataNodePlanePosition(const mitk::DataNode::Pointer node, int id) { QmitkRenderWindow* selectedRenderWindow = 0; QmitkRenderWindow* axialWindow = this->GetRenderWindowPart()->GetQmitkRenderWindow("axial"); QmitkRenderWindow* saggitalWindow = this->GetRenderWindowPart()->GetQmitkRenderWindow("sagittal"); QmitkRenderWindow* coronalWindow = this->GetRenderWindowPart()->GetQmitkRenderWindow("coronal"); bool PlanarFigureInitializedWindow = false; //find initialized renderwindow if (node->GetBoolProperty("PlanarFigureInitializedWindow", PlanarFigureInitializedWindow, axialWindow->GetRenderer())) { selectedRenderWindow = axialWindow; } if (!selectedRenderWindow && node->GetBoolProperty( "PlanarFigureInitializedWindow", PlanarFigureInitializedWindow, saggitalWindow->GetRenderer())) { selectedRenderWindow = saggitalWindow; } if (!selectedRenderWindow && node->GetBoolProperty( "PlanarFigureInitializedWindow", PlanarFigureInitializedWindow, coronalWindow->GetRenderer())) { selectedRenderWindow = coronalWindow; } if (selectedRenderWindow) { { mitk::PlanePositionManagerService* service = this->getPlanePositionManagerService(); selectedRenderWindow->GetSliceNavigationController()->ExecuteOperation(service->GetPlanePosition(id)); } mitk::RenderingManager::GetInstance()->ForceImmediateUpdateAll(); } } bool QmitkShapeComparison::loadPlanePositions() { mitk::PlanePositionManagerService* service = this->getPlanePositionManagerService(); int sliceIndex = 0; mitk::PlanarCircle::Pointer positionMarker = mitk::PlanarCircle::New(); mitk::NodePredicateProperty::Pointer isMarker = mitk::NodePredicateProperty::New("isPositionNode", mitk::BoolProperty::New(true)); mitk::DataStorage::SetOfObjects::ConstPointer markers; //load all nodes that are children of the working node in data storage mitk::DataNode* imageNode(m_Controls.selectGeometryImgComboBox->GetSelectedNode()); markers = this->GetDataStorage()->GetDerivations(imageNode, isMarker); if (!markers->empty()) { //iterate over all child nodes with NodePredicateProperty for (mitk::DataStorage::SetOfObjects::const_iterator iter = markers->begin(); iter != markers->end(); ++iter) { int markerId; std::string nodeName = (*iter)->GetName(); //get position nodes in the data manager and add them with the planepositionmanger service if (nodeName == "Planeposition coronal") { mitk::DataNode::Pointer coronalPosNode = (*iter); coronalPosNode->GetIntProperty("sliceIndex", sliceIndex); positionMarker = dynamic_cast (coronalPosNode->GetData()); mitk::PlaneGeometry::ConstPointer corPlane = positionMarker->GetPlaneGeometry(); markerId = service->AddNewPlanePosition(corPlane, sliceIndex); coronalPosNode->SetIntProperty("Plane Position ID", markerId); } else if (nodeName == "Planeposition axial") { mitk::DataNode::Pointer axialPosNode = (*iter); axialPosNode->GetIntProperty("sliceIndex", sliceIndex); positionMarker = dynamic_cast (axialPosNode->GetData()); mitk::PlaneGeometry::ConstPointer axiPlane = positionMarker->GetPlaneGeometry(); markerId = service->AddNewPlanePosition(axiPlane, sliceIndex); axialPosNode->SetIntProperty("Plane Position ID", markerId); } else if (nodeName == "Planeposition sagittal") { mitk::DataNode::Pointer sagittalPosNode = (*iter); sagittalPosNode->GetIntProperty("sliceIndex", sliceIndex); positionMarker = dynamic_cast (sagittalPosNode->GetData()); mitk::PlaneGeometry::ConstPointer sagPlane = positionMarker->GetPlaneGeometry(); markerId = service->AddNewPlanePosition(sagPlane, sliceIndex); sagittalPosNode->SetIntProperty("Plane Position ID", markerId); } (*iter)->GetIntProperty("Plane Position ID", markerId); this->reloadDataNodePlanePosition((*iter), markerId); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } mitk::RenderingManager::GetInstance()->ForceImmediateUpdateAll(); return true; } return false; } mitk::PlanePositionManagerService* QmitkShapeComparison::getPlanePositionManagerService() { ctkPluginContext* context = mitk::org_mitk_gui_qt_shapecomparison_Activator::GetContext(); ctkServiceReference ppmRef = context->getServiceReference(); mitk::PlanePositionManagerService* service = nullptr; service = context->getService(ppmRef); context->ungetService(ppmRef); return service; } void QmitkShapeComparison::GetAxisPositions(mitk::DataNode::Pointer node) { bool planePosLoaded = loadPlanePositions(); if (planePosLoaded) { for (int i = 1; i <= 3; i++) { std::stringstream multiWidgetStream; multiWidgetStream << "stdmulti.widget"; multiWidgetStream << i; std::string multiWidgetString = multiWidgetStream.str(); // mitk::BaseRenderer *rendereri = mitk::BaseRenderer::GetByName(multiWidgetString.c_str()); mitk::BaseRenderer *rendereri = m_Renderer->GetByName(multiWidgetString.c_str()); } } } void QmitkShapeComparison::iteratePlanePosition(Plane plane) { int stopper = 1; for (int i = 0; i < stopper; ++i) { MITK_INFO << "Current plane number: " << i; mitk::PlaneGeometry::Pointer planeGeo = translatePlane(120, plane); //TODO //mitk::Image::Pointer imgSlice = mitk::Image::New(); //mitk::ExtractSliceFilter::Pointer extractor = mitk::ExtractSliceFilter::New(); //extractor->SetInput(m_firstImg); //extractor->SetWorldGeometry(planeGeo); //extractor->SetOutputDimensionality(2); //extractor->SetInPlaneResampleExtentByGeometry(true); //extractor->SetResliceTransformByGeometry(m_firstImg->GetTimeGeometry()->GetGeometryForTimeStep(0)); //extractor->SetInterpolationMode(mitk::ExtractSliceFilter::RESLICE_NEAREST); //extractor->Update(); //imgSlice = extractor->GetOutput(); //mitk::DataNode::Pointer testNode = mitk::DataNode::New(); //testNode->SetData(imgSlice); //testNode->SetVisibility(true); //testNode->SetName("TestNode"); //this->GetDataStorage()->Add(testNode); //this->GetDataStorageReference()->GetDataStorage()->Modified(); //mitk::ShapeComparisonManager *shapeComparisonManager = new mitk::ShapeComparisonManager(m_firstImg, m_secondImg); //TODO //shapeComparisonManager->calculateMetricsSlices(planeGeo, 120); } MITK_INFO << "finished"; } mitk::PlaneGeometry::Pointer QmitkShapeComparison::translatePlane(int id, Plane plane) { mitk::DataNode::Pointer dataNode = m_Controls.selectGeometryImgComboBox->GetSelectedNode(); std::stringstream multiWidgetStream; multiWidgetStream << "stdmulti.widget"; switch (plane) { case QmitkShapeComparison::axial: multiWidgetStream << 1; break; case QmitkShapeComparison::coronal: multiWidgetStream << 2; break; case QmitkShapeComparison::saggital: multiWidgetStream << 3; break; default: break; } std::string multiWidgetString = multiWidgetStream.str(); mitk::BaseRenderer *renderer = mitk::BaseRenderer::GetByName(multiWidgetString.c_str()); const mitk::PlaneGeometry* planeGeo = dynamic_cast(renderer->GetCurrentWorldPlaneGeometry()); mitk::PlaneGeometry::Pointer newPlaneGeo = mitk::PlaneGeometry::New(); newPlaneGeo = planeGeo->Clone(); mitk::Vector3D normal = newPlaneGeo->GetNormal(); newPlaneGeo->GetIndexToWorldTransform()->GetInverseTransform()->TransformVector(normal); // normal already in world cords?! newPlaneGeo->Translate(normal * id); MITK_INFO << "Center der neuen Plane: " << newPlaneGeo->GetCenter(); m_Renderer = renderer; m_Renderer->RequestUpdate(); mitk::RenderingManager::GetInstance()->ForceImmediateUpdateAll(); return newPlaneGeo; } void QmitkShapeComparison::testloadPosition() { mitk::DataNode::Pointer selectedNode = m_Controls.selectGeometryImgComboBox->GetSelectedNode(); GetAxisPositions(selectedNode); mitk::RenderingManager::GetInstance()->InitializeViews(); } diff --git a/Plugins/org.mitk.gui.qt.shapecomparison/src/internal/ShapeComparisonControls.ui b/Plugins/org.mitk.gui.qt.shapecomparison/src/internal/ShapeComparisonControls.ui index e004cbd128..02bb3602e6 100644 --- a/Plugins/org.mitk.gui.qt.shapecomparison/src/internal/ShapeComparisonControls.ui +++ b/Plugins/org.mitk.gui.qt.shapecomparison/src/internal/ShapeComparisonControls.ui @@ -1,435 +1,468 @@ ShapeComparisonControls Qt::WindowModal 0 0 372 680 0 0 0 100 Form true 0 0 0 75 First false 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 QLabel { color: rgb(0, 0, 0) } Select first Image true + + + 0 + 0 + + true 0 0 0 95 Second false 0 0 QLabel { color: rgb(0, 0, 0) } Select second Image 0 0 0 0 Geometry 0 0 Output path true 0 0 compare - + - + 0 0 0 100 Results 0 15 FNR: Jaccard Coeff: FPR: Volume Similarity: Dice Coeff: true + + + 0 + 0 + + 1 - + false - + 0 0 false Label Overlap + - + + + + 0 + 0 + + - + Distance + - + + + + 0 + 0 + + - Page + Curvature + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 188 + + + + - - - - Qt::Vertical - - - QSizePolicy::Expanding - - - - 20 - 188 - - - - QmitkDataStorageComboBox QComboBox
QmitkDataStorageComboBox.h
+ + QmitkChartWidget + QWidget +
qmitkchartwidget.h
+ 1 +
diff --git a/Plugins/org.mitk.gui.qt.shapecomparison/src/internal/org_mitk_gui_qt_shapecomparison_Activator.cpp b/Plugins/org.mitk.gui.qt.shapecomparison/src/internal/org_mitk_gui_qt_shapecomparison_Activator.cpp new file mode 100644 index 0000000000..18e018f2d7 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.shapecomparison/src/internal/org_mitk_gui_qt_shapecomparison_Activator.cpp @@ -0,0 +1,51 @@ +/*========================================================================= + +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 "org_mitk_gui_qt_shapecomparison_Activator.h" + +#include "QmitkShapeComparison.h" +#include + +#include +#include + +US_INITIALIZE_MODULE + +namespace mitk { + + ctkPluginContext* org_mitk_gui_qt_shapecomparison_Activator::m_Context = 0; + + void org_mitk_gui_qt_shapecomparison_Activator::start(ctkPluginContext* context) + { + BERRY_REGISTER_EXTENSION_CLASS(QmitkShapeComparison, context) + m_Context = context; + } + + void org_mitk_gui_qt_shapecomparison_Activator::stop(ctkPluginContext* context) + { + Q_UNUSED(context) + } + + ctkPluginContext* org_mitk_gui_qt_shapecomparison_Activator::GetContext() + { + return m_Context; + } +} + +#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) +Q_EXPORT_PLUGIN2(org_mitk_gui_qt_shapecomparison, mitk::PluginActivator) +#endif \ No newline at end of file diff --git a/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/org_mitk_gui_qt_surfaceregistration_Activator.h b/Plugins/org.mitk.gui.qt.shapecomparison/src/internal/org_mitk_gui_qt_shapecomparison_Activator.h similarity index 69% copy from Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/org_mitk_gui_qt_surfaceregistration_Activator.h copy to Plugins/org.mitk.gui.qt.shapecomparison/src/internal/org_mitk_gui_qt_shapecomparison_Activator.h index 01756f3873..298917bf50 100644 --- a/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/org_mitk_gui_qt_surfaceregistration_Activator.h +++ b/Plugins/org.mitk.gui.qt.shapecomparison/src/internal/org_mitk_gui_qt_shapecomparison_Activator.h @@ -1,42 +1,47 @@ /*=================================================================== 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 org_mitk_gui_qt_surfaceregistration_Activator_h -#define org_mitk_gui_qt_surfaceregistration_Activator_h +#ifndef org_mitk_gui_qt_shapecomparison_Activator_h +#define org_mitk_gui_qt_shapecomparison_Activator_h #include namespace mitk { - class org_mitk_gui_qt_surfaceregistration_Activator : + class org_mitk_gui_qt_shapecomparison_Activator : public QObject, public ctkPluginActivator { Q_OBJECT #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) - Q_PLUGIN_METADATA(IID "org_mitk_gui_qt_surfaceregistration") + Q_PLUGIN_METADATA(IID "org_mitk_gui_qt_shapecomparison") #endif Q_INTERFACES(ctkPluginActivator) public: void start(ctkPluginContext* context) override; void stop(ctkPluginContext* context) override; + static ctkPluginContext* GetContext(); + +private: + static ctkPluginContext* m_Context; + }; // PluginActivator } -#endif // org_mitk_gui_qt_surfaceregistration_Activator_h +#endif // org_mitk_gui_qt_shapecomparison_Activator_h diff --git a/Plugins/org.mitk.gui.qt.surfaceregistration/CMakeLists.txt b/Plugins/org.mitk.gui.qt.surfaceregistration/CMakeLists.txt index 79422fc910..7d413f83a2 100644 --- a/Plugins/org.mitk.gui.qt.surfaceregistration/CMakeLists.txt +++ b/Plugins/org.mitk.gui.qt.surfaceregistration/CMakeLists.txt @@ -1,8 +1,8 @@ project(org_mitk_gui_qt_surfaceregistration) mitk_create_plugin( EXPORT_DIRECTIVE MITK_QT_SURFACEREGISTRATION EXPORTED_INCLUDE_SUFFIXES src - MODULE_DEPENDS MitkQtWidgetsExt MitkSurfaceRegistration + MODULE_DEPENDS MitkQtWidgetsExt MitkSurfaceRegistration MitkSceneSerialization MitkShapeComparison ) diff --git a/Plugins/org.mitk.gui.qt.surfaceregistration/files.cmake b/Plugins/org.mitk.gui.qt.surfaceregistration/files.cmake index 9be9068c28..832eceae48 100644 --- a/Plugins/org.mitk.gui.qt.surfaceregistration/files.cmake +++ b/Plugins/org.mitk.gui.qt.surfaceregistration/files.cmake @@ -1,36 +1,35 @@ set(SRC_CPP_FILES ) set(INTERNAL_CPP_FILES org_mitk_gui_qt_surfaceregistration_Activator.cpp QmitkSurfaceRegistration.cpp ) set(UI_FILES src/internal/SurfaceRegistrationControls.ui ) set(MOC_H_FILES src/internal/org_mitk_gui_qt_surfaceregistration_Activator.h src/internal/QmitkSurfaceRegistration.h ) set(CACHED_RESOURCE_FILES resources/icon.png plugin.xml ) set(QRC_FILES - #resources/imagecropper.qrc ) set(CPP_FILES) foreach(file ${SRC_CPP_FILES}) set(CPP_FILES ${CPP_FILES} src/${file}) endforeach(file ${SRC_CPP_FILES}) foreach(file ${INTERNAL_CPP_FILES}) set(CPP_FILES ${CPP_FILES} src/internal/${file}) endforeach(file ${INTERNAL_CPP_FILES}) diff --git a/Plugins/org.mitk.gui.qt.surfaceregistration/plugin.xml b/Plugins/org.mitk.gui.qt.surfaceregistration/plugin.xml index cf5f59fa59..6987bdffef 100644 --- a/Plugins/org.mitk.gui.qt.surfaceregistration/plugin.xml +++ b/Plugins/org.mitk.gui.qt.surfaceregistration/plugin.xml @@ -1,30 +1,22 @@ - Please describe + - - - diff --git a/Plugins/org.mitk.gui.qt.surfaceregistration/resources/icon.png b/Plugins/org.mitk.gui.qt.surfaceregistration/resources/icon.png index 88300643d6..d7283370f7 100644 Binary files a/Plugins/org.mitk.gui.qt.surfaceregistration/resources/icon.png and b/Plugins/org.mitk.gui.qt.surfaceregistration/resources/icon.png differ 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 8c89d61ad0..7b2c9c5754 100644 --- a/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/QmitkSurfaceRegistration.cpp +++ b/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/QmitkSurfaceRegistration.cpp @@ -1,572 +1,833 @@ /*========================================================================= 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "org_mitk_gui_qt_surfaceregistration_Activator.h" #include #include #include #include #include #include #include #include #include +#include #include #include + + const std::string QmitkSurfaceRegistration::VIEW_ID = "org.mitk.views.surfaceregistration"; QmitkSurfaceRegistration::QmitkSurfaceRegistration(QObject *parent) : m_ParentWidget(0) { } QmitkSurfaceRegistration::~QmitkSurfaceRegistration() { m_movingSurface = nullptr; m_targetSurface = nullptr; } void QmitkSurfaceRegistration::SetFocus() { m_Controls.registerAndComparePushButton->setFocus(); } QWidget * QmitkSurfaceRegistration::GetControls() { return nullptr; } void QmitkSurfaceRegistration::CreateQtPartControl(QWidget *parent) { // create GUI widgets from the Qt Designer's .ui file m_Controls.setupUi(parent); m_Controls.movingSurfaceNameComboBox->SetDataStorage(this->GetDataStorage()); m_Controls.movingSurfaceNameComboBox->SetPredicate(mitk::NodePredicateAnd::New( mitk::TNodePredicateDataType::New(), mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("helper object")))); m_Controls.targetSurfaceNameComboBox->SetDataStorage(this->GetDataStorage()); m_Controls.targetSurfaceNameComboBox->SetPredicate(mitk::NodePredicateAnd::New( mitk::TNodePredicateDataType::New(), mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("helper object")))); m_Controls.imageSelectorComboBox->SetDataStorage(this->GetDataStorage()); m_Controls.imageSelectorComboBox->SetPredicate(mitk::NodePredicateAnd::New( mitk::TNodePredicateDataType::New(), mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("helper object")))); connect(m_Controls.registerAndComparePushButton, SIGNAL(clicked()), this, SLOT(doRegisterAndCompare())); connect(m_Controls.movingSurfaceNameComboBox, SIGNAL(OnSelectionChanged(const mitk::DataNode *)), this, SLOT(OnSelectedMovingSurfaceChanged(const mitk::DataNode *))); connect(m_Controls.targetSurfaceNameComboBox, SIGNAL(OnSelectionChanged(const mitk::DataNode *)), this, SLOT(OnSelectedTargetSurfaceChanged(const mitk::DataNode *))); connect(m_Controls.imageSelectorComboBox, SIGNAL(OnSelectionChanged(const mitk::DataNode *)), this, SLOT(OnSelectedImageChanged(const mitk::DataNode *))); connect(m_Controls.registerAndCompareAllPushButton, SIGNAL(clicked()), this, SLOT(doRegisterAndCompareAll())); connect(m_Controls.comparePushButton, SIGNAL(clicked()), this, SLOT(doCompare())); mitk::RenderingManager::GetInstance()->SetDataStorage(this->GetDataStorageReference()->GetDataStorage()); mitk::RenderingManager::GetInstance()->InitializeViews(); m_Controls.automatizedGroupBox->setEnabled(true); m_Controls.OutputLineEdit->setEnabled(true); m_Controls.registerAndCompareAllPushButton->setEnabled(true); + m_Controls.comparePushButton->setEnabled(true); + //initializeWithSceneFile(); - initializeWithSceneFile(); m_ParentWidget = parent; + + } void QmitkSurfaceRegistration::OnSelectedMovingSurfaceChanged(const mitk::DataNode *node) { if (node != nullptr) { m_movingSurface = dynamic_cast(node->GetData()); + m_movingSurface->SetObjectName(node->GetObjectName()); m_Controls.selectMovingSurfaceLabel->setText("Selected moving surface:"); m_Controls.mirroringCheckBox->setEnabled(true); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); if (m_targetSurface != nullptr && m_targetSurface.GetPointer() != m_movingSurface.GetPointer()) { m_Controls.registerAndComparePushButton->setEnabled(true); m_Controls.comparePushButton->setEnabled(true); } } } void QmitkSurfaceRegistration::OnSelectedTargetSurfaceChanged(const mitk::DataNode *node) { if (node != nullptr) { m_targetSurface = dynamic_cast(node->GetData()); + m_targetSurface->SetObjectName(node->GetObjectName()); m_Controls.selectTargetSurfaceLabel->setText("Selected target surface:"); m_Controls.mappedDataGroupBox->setEnabled(true); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); if (m_movingSurface != nullptr && m_targetSurface.GetPointer() != m_movingSurface.GetPointer()) { m_Controls.registerAndComparePushButton->setEnabled(true); m_Controls.comparePushButton->setEnabled(true); } } } void QmitkSurfaceRegistration::OnSelectedImageChanged(const mitk::DataNode *) { //TODO? } void QmitkSurfaceRegistration::doRegisterAndCompare() { - MITK_INFO << "execute clicked..."; - - mitk::ProgressBar::GetInstance()->AddStepsToDo(1); + mitk::ProgressBar::GetInstance()->AddStepsToDo(2); mitk::ProgressBar::GetInstance()->Progress(); + MITK_INFO << "Moving Name: " + m_movingSurface->GetObjectName(); + MITK_INFO << "Target Name: " + m_targetSurface->GetObjectName(); + m_SurfaceRegistrationManager = new mitk::SurfaceRegistrationManager(m_movingSurface, m_targetSurface); m_SurfaceRegistrationManager->setMirroring(m_Controls.mirroringCheckBox->isChecked()); m_SurfaceRegistrationManager->performRegistration(); + m_SurfaceRegistrationManager->setMirroring(false); m_registeredSurface = m_SurfaceRegistrationManager->getRegisteredSurface(); - mitk::Image::Pointer currentlySelectedImage =dynamic_cast(m_Controls.imageSelectorComboBox->GetSelectedNode()->GetData()); + + mitk::DataNode::Pointer registeredSurface = mitk::DataNode::New(); + registeredSurface->SetData(m_registeredSurface); + registeredSurface->SetVisibility(true); + registeredSurface->SetName(m_movingSurface->GetObjectName() + "_RegisteredSurface"); + + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + //make sure to automatically select orig img + mitk::DataNode::Pointer origImgNode = getGeometryNodeFromTarget(m_targetSurface); + + MITK_INFO << "Original name of target: " + origImgNode->GetName(); + //m_Controls.imageSelectorComboBox->SetSelectedNode(origImgNode); + + //mitk::Image::Pointer currentlySelectedImage =dynamic_cast(m_Controls.imageSelectorComboBox->GetSelectedNode()->GetData()); + mitk::Image::Pointer currentlySelectedImage = dynamic_cast(origImgNode->GetData()); mitk::Image::Pointer registeredImg = ConvertSurfaceToImage(currentlySelectedImage, m_registeredSurface); mitk::Image::Pointer targetImg = ConvertSurfaceToImage(currentlySelectedImage, m_targetSurface); mitk::DataNode::Pointer registerdNode = mitk::DataNode::New(); registerdNode->SetData(registeredImg); registerdNode->SetVisibility(true); - registerdNode->SetName("RegisteredMovingNode"); + registerdNode->SetName(m_movingSurface->GetObjectName()+ "_Registered"); + mitk::DataNode::Pointer targetNode = mitk::DataNode::New(); targetNode->SetData(targetImg); targetNode->SetVisibility(true); - targetNode->SetName("TargetNode"); + targetNode->SetName(m_targetSurface->GetObjectName() + "_Target"); this->GetDataStorage()->Add(registerdNode); this->GetDataStorage()->Add(targetNode); + this->GetDataStorage()->Add(registeredSurface); this->GetDataStorageReference()->GetDataStorage()->Modified(); + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! m_SurfaceRegistrationManager->performComparison(); mitk::DataNode::Pointer colouredData = mitk::DataNode::New(); colouredData = m_SurfaceRegistrationManager->getColourTransformedDataNode(); colouredData->SetName(m_Controls.mappedDataNameLineEdit->text().toStdString()); this->GetDataStorage()->Add(colouredData); this->GetDataStorageReference()->GetDataStorage()->Modified(); mitk::RenderingManager::GetInstance()->InitializeViews(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); vtkSmartPointer lut = m_SurfaceRegistrationManager->getTable(); showLookUpTable(lut); mitk::ProgressBar::GetInstance()->Progress(); - doCompare(); } void QmitkSurfaceRegistration::doRegisterAndCompareAll() { MITK_INFO << "Compare all surfaces in Storage "; mitk::ProgressBar::GetInstance()->AddStepsToDo(2); mitk::ProgressBar::GetInstance()->Progress(); auto datastorage = this->GetDataStorage(); + mitk::NodePredicateDataType::Pointer isImage = mitk::NodePredicateDataType::New("Image"); + mitk::DataStorage::SetOfObjects::ConstPointer images = datastorage->GetSubset(isImage); + QString leftOrigName; + QString rightOrigName; + if (!images->empty()) + { + for (mitk::DataStorage::SetOfObjects::const_iterator iter = images->begin(); iter != images->end(); ++iter) + { + mitk::DataNode::Pointer node = (*iter); + if (QString(node->GetName().c_str()).contains(QString("orig"), Qt::CaseSensitive)) + { + if (leftOrigName == "") + { + leftOrigName = QString(node->GetName().c_str()).remove("_orig"); + } + else if (rightOrigName == "" && rightOrigName != leftOrigName) + { + rightOrigName = QString(node->GetName().c_str()).remove("_orig"); + } + } + } + } + mitk::NodePredicateDataType::Pointer isSurface = mitk::NodePredicateDataType::New("Surface"); mitk::DataStorage::SetOfObjects::ConstPointer surfaces = datastorage->GetSubset(isSurface); if (!surfaces->empty()) { //initialize variables mitk::Surface::Pointer tibiaLeft= nullptr; mitk::Surface::Pointer fibulaLeft = nullptr; mitk::Surface::Pointer talusLeft = nullptr; mitk::Surface::Pointer tibiaRight = nullptr; mitk::Surface::Pointer fibulaRight = nullptr; mitk::Surface::Pointer talusRight = nullptr; //iterate over all child nodes with NodePredicateProperty for (mitk::DataStorage::SetOfObjects::const_iterator iter = surfaces->begin(); iter != surfaces->end(); ++iter) { mitk::DataNode::Pointer node = (*iter); //check for left - if (QString(node->GetName().c_str()).contains(QString("L"), Qt::CaseSensitive)) + if (QString(node->GetName().c_str()).contains(QString(leftOrigName), Qt::CaseSensitive)) { if (QString(node->GetName().c_str()).contains(QString("Tibia"), Qt::CaseSensitive)) { mitk::DataNode* tibiaNode(this->GetDataStorage()->GetNamedNode(node->GetName())); tibiaLeft = dynamic_cast(tibiaNode->GetData()); + tibiaLeft->SetObjectName("Tibia_"+ leftOrigName.toStdString()); } else if (QString(node->GetName().c_str()).contains(QString("Fibula"), Qt::CaseSensitive)) { mitk::DataNode* fibulaNode(this->GetDataStorage()->GetNamedNode(node->GetName())); fibulaLeft = dynamic_cast(fibulaNode->GetData()); + fibulaLeft->SetObjectName("Fibula_" +leftOrigName.toStdString()); } else if (QString(node->GetName().c_str()).contains(QString("Talus"), Qt::CaseSensitive)) { mitk::DataNode* talusNode(this->GetDataStorage()->GetNamedNode(node->GetName())); talusLeft = dynamic_cast(talusNode->GetData()); + talusLeft->SetObjectName("Talus_" + leftOrigName.toStdString()); } }//check for right - else if (QString(node->GetName().c_str()).contains(QString("R"), Qt::CaseSensitive)) + else if (QString(node->GetName().c_str()).contains(QString(rightOrigName), Qt::CaseSensitive)) { if (QString(node->GetName().c_str()).contains(QString("Tibia"), Qt::CaseSensitive)) { mitk::DataNode* tibiaMovingNode(this->GetDataStorage()->GetNamedNode(node->GetName())); tibiaRight = dynamic_cast(tibiaMovingNode->GetData()); + tibiaRight->SetObjectName("Tibia_" + rightOrigName.toStdString()); } else if (QString(node->GetName().c_str()).contains(QString("Fibula"), Qt::CaseSensitive)) { mitk::DataNode* fibulaMovingNode(this->GetDataStorage()->GetNamedNode(node->GetName())); fibulaRight = dynamic_cast(fibulaMovingNode->GetData()); + fibulaRight->SetObjectName("Fibula_" + rightOrigName.toStdString()); } else if (QString(node->GetName().c_str()).contains(QString("Talus"), Qt::CaseSensitive)) { mitk::DataNode* talusMovingNode(this->GetDataStorage()->GetNamedNode(node->GetName())); talusRight = dynamic_cast(talusMovingNode->GetData()); + talusRight->SetObjectName("Talus_" + rightOrigName.toStdString()); } } } - MITK_INFO << "Calculating Tibia..."; - performTwoSidedComparison(tibiaLeft, tibiaRight, "Tibia"); - MITK_INFO << "Calculating Fibula..."; - performTwoSidedComparison(fibulaLeft, fibulaRight, "Fibula"); - MITK_INFO << "Calculating Talus..."; - performTwoSidedComparison(talusLeft, talusRight, "Target"); + + //TODO start outputstream + //ASSD + //Overlap + // std::string path = m_movingSurface->GetP TODO Get Property (?) path - remplate + results + std::string resultFile = m_mainDirectory.toStdString() + "Results_" + leftOrigName.toStdString() + "_" + rightOrigName.toStdString() + ".txt"; + MITK_INFO << "printing Results" + resultFile; + std::ofstream resultOutput = ofstream(resultFile, std::ofstream::out); + resultOutput << "Calculating Tibia..." << std::endl; + performTwoSidedComparison(tibiaLeft, tibiaRight, "Tibia", resultOutput); + resultOutput << "Calculating Fibula..." << std::endl; + performTwoSidedComparison(fibulaLeft, fibulaRight, "Fibula", resultOutput); + //resultOutput << "Calculating Talus..." << std::endl; + //performTwoSidedComparison(talusLeft, talusRight, "Target", resultOutput); + + //TODO end outputstream + resultOutput.close(); } mitk::ProgressBar::GetInstance()->Progress(); } void QmitkSurfaceRegistration::doCompare() { - mitk::ProgressBar::GetInstance()->AddStepsToDo(2); + initializeDirectoryList(); + automatizedEvaluation(); + + /* mitk::ProgressBar::GetInstance()->AddStepsToDo(2); mitk::ProgressBar::GetInstance()->Progress(); m_SurfaceRegistrationManager = new mitk::SurfaceRegistrationManager(m_movingSurface, m_targetSurface); m_SurfaceRegistrationManager->performComparison(); mitk::DataNode::Pointer colouredData = mitk::DataNode::New(); colouredData = m_SurfaceRegistrationManager->getColourTransformedDataNode(); colouredData->SetName(m_Controls.mappedDataNameLineEdit->text().toStdString()); this->GetDataStorage()->Add(colouredData); this->GetDataStorageReference()->GetDataStorage()->Modified(); mitk::RenderingManager::GetInstance()->InitializeViews(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); vtkSmartPointer lut = m_SurfaceRegistrationManager->getTable(); showLookUpTable(lut); testloadPosition(); iteratePlanePosition(axial); iteratePlanePosition(coronal); iteratePlanePosition(saggital); - mitk::ProgressBar::GetInstance()->Progress(); + mitk::ProgressBar::GetInstance()->Progress();*/ +} + +void QmitkSurfaceRegistration::initializeDirectoryList() +{ + // + QDir directory = QDir(m_mainDirectory); + QStringList foundDirs = directory.entryList(QDir::AllDirs); + m_Directories = QStringList(); + if (foundDirs.first() == "." ) + { + foundDirs.pop_front(); + } + if (foundDirs.first() == "..") + { + foundDirs.pop_front(); + } + for (int i = 0; i < foundDirs.size() ; ++i) + { + m_Directories.insert(i,m_mainDirectory +foundDirs[i]); + MITK_INFO << m_Directories.at(i); + + } + MITK_INFO << " *...............................*"; } -void QmitkSurfaceRegistration::performTwoSidedComparison(mitk::Surface::Pointer left, mitk::Surface::Pointer right, QString resultName) +void QmitkSurfaceRegistration::automatizedEvaluation() +{ + QStringList allFeetDirs; + QStringList::const_iterator constIterator; + for (int i = 0; i < m_Directories.size(); ++i) + { + allFeetDirs.append((m_Directories.at(i)+ "/Left")); + allFeetDirs.append((m_Directories.at(i) + "/Right")); + } + for (int i = 0; i < allFeetDirs.size() - 1; ++i) + { + for (int j = i + 1; j < allFeetDirs.size(); ++j) + { + MITK_INFO << allFeetDirs.at(i).toStdString(); + MITK_INFO << allFeetDirs.at(j).toStdString(); + if (allFeetDirs.at(i).contains("Left") && allFeetDirs.at(j).contains("Left")) + { + m_Controls.mirroringCheckBox->setChecked(false); + // m_SurfaceRegistrationManager->setMirroring(false); + } + else if (allFeetDirs.at(i).contains("Right") && allFeetDirs.at(j).contains("Right")) + { + m_Controls.mirroringCheckBox->setChecked(false); + // m_SurfaceRegistrationManager->setMirroring(false); + } + else + { + m_Controls.mirroringCheckBox->setChecked(true); + // m_SurfaceRegistrationManager->setMirroring(true); + } + compareAnklePath(allFeetDirs.at(i), allFeetDirs.at(j)); + } + } +} + +void QmitkSurfaceRegistration::compareAnklePath(QString pathA, QString pathB) +{ + //load scene Files + QString pathAtemplate = pathA + "/template.mitk"; + MITK_INFO << "PathA: " << pathA.toStdString(); + MITK_INFO << "PathB: " << pathB.toStdString(); + + QString pathBtemplate = pathB + "/template.mitk"; + mitk::SceneIO::Pointer sceneIO = mitk::SceneIO::New(); + sceneIO->LoadScene(pathAtemplate.toStdString(), this->GetDataStorageReference()->GetDataStorage(), false); + sceneIO->LoadScene(pathBtemplate.toStdString(), this->GetDataStorageReference()->GetDataStorage(), false); + this->GetDataStorageReference()->GetDataStorage()->Modified(); + mitk::RenderingManager::GetInstance()->ForceImmediateUpdateAll(); + mitk::RenderingManager::GetInstance()->InitializeViewsByBoundingObjects(this->GetDataStorageReference()->GetDataStorage()); + + //evaluate + doRegisterAndCompareAll(); + std::string filename = pathA.toStdString() + "/Results/" + pathB.remove(m_mainDirectory).remove("/").toStdString()+ "results.mitk"; + MITK_INFO << "Filename: " << filename; + + sceneIO->SaveScene(this->GetDataStorage()->GetAll(), this->GetDataStorage(), filename); + + //Close Project + auto allItems = this->GetDataStorage()->GetAll(); + int size = allItems->Size(); + for (int i = 0; i < size; ++i) + { + this->GetDataStorage()->Remove(allItems->at(i)); + } + MITK_INFO << "DS size: " << this->GetDataStorage()->GetAll()->Size(); +} + +void QmitkSurfaceRegistration::performTwoSidedComparison(mitk::Surface::Pointer left, mitk::Surface::Pointer right, QString resultName, std::ofstream &resultOutput) { if (left != nullptr && right != nullptr) { - m_Controls.mirroringCheckBox->setChecked(true); + // m_Controls.mirroringCheckBox->setChecked(true); m_movingSurface = left; m_targetSurface = right; - m_Controls.mappedDataNameLineEdit->setText(resultName + "MovingL"); + m_Controls.mappedDataNameLineEdit->setText(resultName +"MovingL"); doRegisterAndCompare(); + double meanA = m_SurfaceRegistrationManager->getDistanceResults()["Mean"]; + m_movingSurface = right; m_targetSurface = left; m_Controls.mappedDataNameLineEdit->setText(resultName + "MovingR"); doRegisterAndCompare(); + performTwoSidedLabelOverlapComparison(left, right, resultOutput); + double meanB = m_SurfaceRegistrationManager->getDistanceResults()["Mean"]; + + double ASSD = calculateASSD(meanA, meanB); + resultOutput << " ASSD: " << ASSD << std::endl; + } +} + +void QmitkSurfaceRegistration::performTwoSidedLabelOverlapComparison(mitk::Surface::Pointer left, mitk::Surface::Pointer right, std::ofstream &resultOutput) +{ + auto datastorage = this->GetDataStorage(); + mitk::Image::Pointer registeredImg; + mitk::Image::Pointer targetImg; + mitk::DataNode::Pointer origImgNode; + if (QString(left->GetObjectName().c_str()).contains(QString("L"), Qt::CaseSensitive)) + { + auto registeredNode = datastorage->GetNamedNode(left->GetObjectName() + "_Registered"); + registeredImg = dynamic_cast(registeredNode->GetData()); + auto targetNode = datastorage->GetNamedNode(right->GetObjectName() + "_Target"); + targetImg = dynamic_cast(targetNode->GetData()); + origImgNode = getGeometryNodeFromTarget(right); + } + else if (QString(left->GetObjectName().c_str()).contains(QString("R"), Qt::CaseSensitive)) + { + auto registeredNode = datastorage->GetNamedNode(right->GetObjectName() + "_Registered"); + registeredImg = dynamic_cast(registeredNode->GetData()); + auto targetNode = datastorage->GetNamedNode(left->GetObjectName() + "_Target"); + targetImg = dynamic_cast(targetNode->GetData()); + origImgNode = getGeometryNodeFromTarget(left); + } + + m_Controls.imageSelectorComboBox->SetSelectedNode(origImgNode); + testloadPosition(); + + // testing + mitk::DataNode::Pointer testRegNode = mitk::DataNode::New(); + testRegNode->SetData(registeredImg); + testRegNode->SetVisibility(true); + testRegNode->SetName("RegTest"); + + mitk::DataNode::Pointer testTarNode = mitk::DataNode::New(); + testTarNode->SetData(targetImg); + testTarNode->SetVisibility(true); + testTarNode->SetName("TarTest"); + + this->GetDataStorage()->Add(testRegNode); + this->GetDataStorage()->Add(testTarNode); + this->GetDataStorageReference()->GetDataStorage()->Modified(); + //testing// + + mitk::ShapeComparisonManager *shapeComparisonManager = new mitk::ShapeComparisonManager(registeredImg, targetImg); + shapeComparisonManager->calculateMetrics(); + std::map labelOverlapResults = shapeComparisonManager->getLabelOverlapResults(); + MITK_INFO << "FPR: " << QString::number(labelOverlapResults["FPR"]); + MITK_INFO << "FNR: " << QString::number(labelOverlapResults["FNR"]); + MITK_INFO << "Dice: " << QString::number(labelOverlapResults["Dice"]); + MITK_INFO << "Jaccard: " << QString::number(labelOverlapResults["Jaccard"]); + + resultOutput << " FPR: " << QString::number(labelOverlapResults["FPR"]) << std::endl; + resultOutput << " FNR: " << QString::number(labelOverlapResults["FNR"]) << std::endl; + resultOutput << " Dice: " << QString::number(labelOverlapResults["Dice"]) << std::endl; + resultOutput << " Jaccard: " << QString::number(labelOverlapResults["Jaccard"]) << std::endl; + //MITK_INFO << "Volume Similarity: " << QString::number(labelOverlapResults[""]); +} + +mitk::DataNode::Pointer QmitkSurfaceRegistration::getGeometryNodeFromTarget(mitk::Surface::Pointer target) +{ + mitk::NodePredicateDataType::Pointer isImage = mitk::NodePredicateDataType::New("Image"); + auto datastorage = this->GetDataStorage(); + mitk::DataStorage::SetOfObjects::ConstPointer images = datastorage->GetSubset(isImage); + mitk::DataNode::Pointer origImgNode = mitk::DataNode::New(); + if (!images->empty()) + { + //iterate over all child nodes with NodePredicateProperty + for (mitk::DataStorage::SetOfObjects::const_iterator iter = images->begin(); iter != images->end(); ++iter) + { + mitk::DataNode::Pointer node = (*iter); + std::string name = node->GetObjectName(); + // MITK_INFO << "DS: " << this->GetDataStorage()->GetAll()->Size(); + //check for for orig + if (QString(node->GetName().c_str()).contains(QString("orig"), Qt::CaseSensitive)) + { + if (QString(target->GetObjectName().c_str()).contains(QString("R"), Qt::CaseSensitive) && QString(node->GetName().c_str()).contains(QString("R"), Qt::CaseSensitive)) + { + origImgNode = node; + } + else if (QString(target->GetObjectName().c_str()).contains(QString("L"), Qt::CaseSensitive) && QString(node->GetName().c_str()).contains(QString("L"), Qt::CaseSensitive)) + { + origImgNode = node; + } + } + } } + return origImgNode; } void QmitkSurfaceRegistration::showLookUpTable(vtkSmartPointer lut) { mitk::BaseRenderer::Pointer renderer = mitk::BaseRenderer::GetInstance(mitk::BaseRenderer::GetRenderWindowByName("stdmulti.widget4")); m_colorBarAnnotation = mitk::ColorBarAnnotation::New(); mitk::LookupTable::Pointer mitkTable = mitk::LookupTable::New(); mitkTable->SetVtkLookupTable(lut); mitk::LookupTableProperty::Pointer prop = mitk::LookupTableProperty::New(mitkTable); m_colorBarAnnotation->SetProperty("ColorBarAnnotation.LookupTable", prop.GetPointer()); MITK_INFO<GetPropertyList(); m_colorBarAnnotation->SetNumberOfLabels(9); m_colorBarAnnotation->SetAnnotationTextScaling(true); m_colorBarAnnotation->SetDrawAnnotations(true); m_colorBarAnnotation->SetDrawTickLabels(true); mitk::LayoutAnnotationRenderer::AddAnnotation( m_colorBarAnnotation, renderer, mitk::LayoutAnnotationRenderer::Right, 10, 10, 10); } +double QmitkSurfaceRegistration::calculateASSD(double meanA, double meanB) +{ + return (meanA + meanB)/2; +} + void QmitkSurfaceRegistration::initializeWithSceneFile() { - - std::string fileName = "D:/data/AllComplete/AA246/template.mitk"; + std::string fileNameRight= "D:/ShapeComparison/TestCase/AA246/Right/template.mitk"; + std::string fileNameLeft = "D:/ShapeComparison/TestCase/AA246/Left/template.mitk"; mitk::SceneIO::Pointer sceneIO = mitk::SceneIO::New(); - sceneIO->LoadScene(fileName, this->GetDataStorageReference()->GetDataStorage(), false); - + sceneIO->LoadScene(fileNameRight, this->GetDataStorageReference()->GetDataStorage(), false); + sceneIO->LoadScene(fileNameLeft, this->GetDataStorageReference()->GetDataStorage(), false); this->GetDataStorageReference()->GetDataStorage()->Modified(); mitk::RenderingManager::GetInstance()->ForceImmediateUpdateAll(); mitk::RenderingManager::GetInstance()->InitializeViewsByBoundingObjects(this->GetDataStorageReference()->GetDataStorage()); } void QmitkSurfaceRegistration::reloadDataNodePlanePosition(const mitk::DataNode::Pointer node, int id) { QmitkRenderWindow* selectedRenderWindow = 0; QmitkRenderWindow* axialWindow = this->GetRenderWindowPart()->GetQmitkRenderWindow("axial"); QmitkRenderWindow* saggitalWindow = this->GetRenderWindowPart()->GetQmitkRenderWindow("sagittal"); QmitkRenderWindow* coronalWindow = this->GetRenderWindowPart()->GetQmitkRenderWindow("coronal"); bool PlanarFigureInitializedWindow = false; //find initialized renderwindow if (node->GetBoolProperty("PlanarFigureInitializedWindow", PlanarFigureInitializedWindow, axialWindow->GetRenderer())) { selectedRenderWindow = axialWindow; } if (!selectedRenderWindow && node->GetBoolProperty( "PlanarFigureInitializedWindow", PlanarFigureInitializedWindow, saggitalWindow->GetRenderer())) { selectedRenderWindow = saggitalWindow; } if (!selectedRenderWindow && node->GetBoolProperty( "PlanarFigureInitializedWindow", PlanarFigureInitializedWindow, coronalWindow->GetRenderer())) { selectedRenderWindow = coronalWindow; } if (selectedRenderWindow) { { mitk::PlanePositionManagerService* service = this->getPlanePositionManagerService(); selectedRenderWindow->GetSliceNavigationController()->ExecuteOperation(service->GetPlanePosition(id)); } mitk::RenderingManager::GetInstance()->ForceImmediateUpdateAll(); } } bool QmitkSurfaceRegistration::loadPlanePositions() { MITK_INFO << m_Controls.imageSelectorComboBox->currentIndex(); if (m_Controls.imageSelectorComboBox->currentIndex() < 0) { return false; } mitk::PlanePositionManagerService* service = this->getPlanePositionManagerService(); int sliceIndex = 0; mitk::PlanarCircle::Pointer positionMarker = mitk::PlanarCircle::New(); mitk::NodePredicateProperty::Pointer isMarker = mitk::NodePredicateProperty::New("isPositionNode", mitk::BoolProperty::New(true)); mitk::DataStorage::SetOfObjects::ConstPointer markers; //load all nodes that are children of the working node in data storage mitk::DataNode* imageNode(m_Controls.imageSelectorComboBox->GetSelectedNode()); markers = this->GetDataStorage()->GetDerivations(imageNode, isMarker); if (!markers->empty()) { //iterate over all child nodes with NodePredicateProperty for (mitk::DataStorage::SetOfObjects::const_iterator iter = markers->begin(); iter != markers->end(); ++iter) { int markerId; std::string nodeName = (*iter)->GetName(); //get position nodes in the data manager and add them with the planepositionmanger service if (nodeName == "Planeposition coronal") { mitk::DataNode::Pointer coronalPosNode = (*iter); coronalPosNode->GetIntProperty("sliceIndex", sliceIndex); positionMarker = dynamic_cast (coronalPosNode->GetData()); mitk::PlaneGeometry::ConstPointer corPlane = positionMarker->GetPlaneGeometry(); markerId = service->AddNewPlanePosition(corPlane, sliceIndex); coronalPosNode->SetIntProperty("Plane Position ID", markerId); } else if (nodeName == "Planeposition axial") { mitk::DataNode::Pointer axialPosNode = (*iter); axialPosNode->GetIntProperty("sliceIndex", sliceIndex); positionMarker = dynamic_cast (axialPosNode->GetData()); mitk::PlaneGeometry::ConstPointer axiPlane = positionMarker->GetPlaneGeometry(); markerId = service->AddNewPlanePosition(axiPlane, sliceIndex); axialPosNode->SetIntProperty("Plane Position ID", markerId); } else if (nodeName == "Planeposition sagittal") { mitk::DataNode::Pointer sagittalPosNode = (*iter); sagittalPosNode->GetIntProperty("sliceIndex", sliceIndex); positionMarker = dynamic_cast (sagittalPosNode->GetData()); mitk::PlaneGeometry::ConstPointer sagPlane = positionMarker->GetPlaneGeometry(); markerId = service->AddNewPlanePosition(sagPlane, sliceIndex); sagittalPosNode->SetIntProperty("Plane Position ID", markerId); } (*iter)->GetIntProperty("Plane Position ID", markerId); this->reloadDataNodePlanePosition((*iter), markerId); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } mitk::RenderingManager::GetInstance()->ForceImmediateUpdateAll(); return true; } return false; } mitk::PlanePositionManagerService* QmitkSurfaceRegistration::getPlanePositionManagerService() { ctkPluginContext* context = mitk::org_mitk_gui_qt_surfaceregistration_Activator::GetContext(); ctkServiceReference ppmRef = context->getServiceReference(); mitk::PlanePositionManagerService* service = nullptr; service = context->getService(ppmRef); context->ungetService(ppmRef); return service; } void QmitkSurfaceRegistration::GetAxisPositions(mitk::DataNode::Pointer node) { bool planePosLoaded = loadPlanePositions(); if (planePosLoaded) { for (int i = 1; i <= 3; i++) { std::stringstream multiWidgetStream; multiWidgetStream << "stdmulti.widget"; multiWidgetStream << i; std::string multiWidgetString = multiWidgetStream.str(); mitk::BaseRenderer *rendereri = mitk::BaseRenderer::GetByName(multiWidgetString.c_str()); } } } void QmitkSurfaceRegistration::iteratePlanePosition(Plane plane) { mitk::ShapeComparisonUtil *shapeComparer = new mitk::ShapeComparisonUtil(m_registeredSurface, m_targetSurface); //TODO choose from img props int stopper = 50; for (int i = -20; i < stopper; ++i) { MITK_INFO << "Current plane number: " << i; mitk::PlaneGeometry::Pointer planeGeo = translatePlane(i, plane); shapeComparer->calculateSliceDifferences(planeGeo); } MITK_INFO << "finished"; m_Renderer->ForceImmediateUpdate(); } mitk::PlaneGeometry::Pointer QmitkSurfaceRegistration::translatePlane(int id, Plane plane) { mitk::DataNode::Pointer dataNode = m_Controls.imageSelectorComboBox->GetSelectedNode(); std::stringstream multiWidgetStream; multiWidgetStream << "stdmulti.widget"; switch (plane) { case QmitkSurfaceRegistration::axial: multiWidgetStream << 1; break; case QmitkSurfaceRegistration::coronal: multiWidgetStream << 2; break; case QmitkSurfaceRegistration::saggital: multiWidgetStream << 3; break; default: break; } std::string multiWidgetString = multiWidgetStream.str(); mitk::BaseRenderer *renderer = mitk::BaseRenderer::GetByName(multiWidgetString.c_str()); const mitk::PlaneGeometry* planeGeo = dynamic_cast(renderer->GetCurrentWorldPlaneGeometry()); mitk::PlaneGeometry::Pointer newPlaneGeo = mitk::PlaneGeometry::New(); newPlaneGeo = planeGeo->Clone(); mitk::Vector3D normal = newPlaneGeo->GetNormal(); newPlaneGeo->GetIndexToWorldTransform()->GetInverseTransform()->TransformVector(normal); // normal already in world cords?! newPlaneGeo->Translate(normal * id); MITK_INFO << "Center der neuen Plane: " << newPlaneGeo->GetCenter(); renderer->RequestUpdate(); m_Renderer = renderer; m_Renderer->RequestUpdate(); mitk::DataNode* imageNode(m_Controls.imageSelectorComboBox->GetSelectedNode()); mitk::RenderingManager::GetInstance()->ForceImmediateUpdateAll(); return newPlaneGeo; } mitk::Image::Pointer QmitkSurfaceRegistration::ConvertSurfaceToImage(mitk::Image::Pointer image, mitk::Surface::Pointer surface) { mitk::ProgressBar::GetInstance()->AddStepsToDo(1); mitk::ProgressBar::GetInstance()->Progress(); mitk::SurfaceToImageFilter::Pointer surfaceToImageFilter = mitk::SurfaceToImageFilter::New(); surfaceToImageFilter->MakeOutputBinaryOn(); surfaceToImageFilter->SetInput(surface); surfaceToImageFilter->SetImage(image); try { surfaceToImageFilter->Update(); } catch (itk::ExceptionObject& excpt) { MITK_ERROR << excpt.GetDescription(); return nullptr; } mitk::ProgressBar::GetInstance()->Progress(); mitk::Image::Pointer resultImage = surfaceToImageFilter->GetOutput(); return resultImage; } void QmitkSurfaceRegistration::testloadPosition() { mitk::DataNode::Pointer selectedNode = m_Controls.imageSelectorComboBox->GetSelectedNode(); mitk::DataNode::Pointer leftOrigNode = nullptr; mitk::DataNode::Pointer rightOrigNode = nullptr; if (QString(selectedNode->GetName().c_str()).contains(QString("L"), Qt::CaseSensitive)) { GetAxisPositions(selectedNode); leftOrigNode = selectedNode.GetPointer(); } else if (QString(selectedNode->GetName().c_str()).contains(QString("R"), Qt::CaseSensitive)) { GetAxisPositions(selectedNode); rightOrigNode = selectedNode.GetPointer(); } mitk::RenderingManager::GetInstance()->InitializeViews(); } 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 ad915f9b15..8581cc44a1 100644 --- a/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/QmitkSurfaceRegistration.h +++ b/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/QmitkSurfaceRegistration.h @@ -1,180 +1,196 @@ /*========================================================================= 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 #include "ui_SurfaceRegistrationControls.h" #include "usServiceRegistration.h" #include "mitkAnnotation.h" #include "mitkColorBarAnnotation.h" #include "mitkDataStorage.h" #include #include #include #include + #include +#include + /*! @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: /*! * @brief executes registration of moving and target surface, * then calculates the closest distances and displays them through a lookuptable. * TODO comparison */ void doRegisterAndCompare(); /*! * @brief Iterates through all files in the data storage and executes for all pairs of tibia, fibula and talus */ void doRegisterAndCompareAll(); void doCompare(); void OnSelectedMovingSurfaceChanged(const mitk::DataNode *); void OnSelectedTargetSurfaceChanged(const mitk::DataNode *); void OnSelectedImageChanged(const mitk::DataNode *); protected: private: /*! * The parent QWidget */ QWidget* m_ParentWidget; mitk::BaseRenderer *m_Renderer; /*! * @brief A pointer to the node of the moving surface. */ mitk::Surface::Pointer m_movingSurface; /*! * @brief A pointer to the node of the target surface. */ mitk::Surface::Pointer m_targetSurface; mitk::Surface::Pointer m_registeredSurface; mitk::SurfaceRegistrationManager *m_SurfaceRegistrationManager; Ui::SurfaceRegistrationControls m_Controls; mitk::ColorBarAnnotation::Pointer m_colorBarAnnotation; - void showLookUpTable(vtkSmartPointer lut); + QStringList m_Directories; + QString m_mainDirectory = "D:/ShapeComparison/TestCase/"; //automatization - void performTwoSidedComparison(mitk::Surface::Pointer left, mitk::Surface::Pointer right, QString resultName); + void initializeDirectoryList(); + + void automatizedEvaluation(); + + void compareAnklePath(QString pathA, QString pathB); + + void performTwoSidedComparison(mitk::Surface::Pointer left, mitk::Surface::Pointer right, QString resultName, std::ofstream& resultOutput); + + void performTwoSidedLabelOverlapComparison(mitk::Surface::Pointer left, mitk::Surface::Pointer right, std::ofstream& resultOutput); + + mitk::DataNode::Pointer getGeometryNodeFromTarget(mitk::Surface::Pointer target); //testing void initializeWithSceneFile(); - //test void testloadPosition(); /*! * @brief Reloads the plane position of the node in the corresponding rendering window * @param int id Id of the markerID corresponding to the rendering window * @param const DataNode::Pointer node */ void reloadDataNodePlanePosition(const mitk::DataNode::Pointer node, int id); enum Plane { axial, coronal, saggital }; /*! * @brief loads the adjusted plan positions from the data storage. The rendering windows are updated afterwards. * @returns true if plane positions are successfully loaded */ bool loadPlanePositions(); mitk::PlanePositionManagerService* getPlanePositionManagerService(); //TODO void GetAxisPositions(mitk::DataNode::Pointer node); void iteratePlanePosition(Plane plane); + double calculateASSD(double meanA, double meanB); /*! * @brief translates the plane in direction of its normal by the length of the id * @param int id the lenght of the normal * @param Plane plane the plane to translate */ mitk::PlaneGeometry::Pointer translatePlane(int id, Plane plane); mitk::Image::Pointer ConvertSurfaceToImage(mitk::Image::Pointer image, mitk::Surface::Pointer surface); + + void showLookUpTable(vtkSmartPointer lut); }; #endif // QmitkSurfaceRegistration_h \ No newline at end of file diff --git a/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/org_mitk_gui_qt_surfaceregistration_Activator.h b/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/org_mitk_gui_qt_surfaceregistration_Activator.h index 01756f3873..a1b11a466a 100644 --- a/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/org_mitk_gui_qt_surfaceregistration_Activator.h +++ b/Plugins/org.mitk.gui.qt.surfaceregistration/src/internal/org_mitk_gui_qt_surfaceregistration_Activator.h @@ -1,42 +1,47 @@ /*=================================================================== 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 org_mitk_gui_qt_surfaceregistration_Activator_h #define org_mitk_gui_qt_surfaceregistration_Activator_h #include namespace mitk { class org_mitk_gui_qt_surfaceregistration_Activator : public QObject, public ctkPluginActivator { Q_OBJECT #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) Q_PLUGIN_METADATA(IID "org_mitk_gui_qt_surfaceregistration") #endif Q_INTERFACES(ctkPluginActivator) public: void start(ctkPluginContext* context) override; void stop(ctkPluginContext* context) override; + static ctkPluginContext* GetContext(); + +private: + static ctkPluginContext* m_Context; + }; // PluginActivator } #endif // org_mitk_gui_qt_surfaceregistration_Activator_h