diff --git a/Modules/IGT/Algorithms/mitkNavigationDataDisplacementFilter.cpp b/Modules/IGT/Algorithms/mitkNavigationDataDisplacementFilter.cpp index 335c1fd11f..9935c10d4a 100644 --- a/Modules/IGT/Algorithms/mitkNavigationDataDisplacementFilter.cpp +++ b/Modules/IGT/Algorithms/mitkNavigationDataDisplacementFilter.cpp @@ -1,73 +1,121 @@ /*=================================================================== 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 "mitkNavigationDataDisplacementFilter.h" #include "mitkPropertyList.h" #include "mitkProperties.h" mitk::NavigationDataDisplacementFilter::NavigationDataDisplacementFilter() -: mitk::NavigationDataToNavigationDataFilter() +: mitk::NavigationDataToNavigationDataFilter(), m_Transform6DOF(false) { m_Offset[0] = 0.0; m_Offset[1] = 0.0; m_Offset[2] = 0.0; + + m_Transformation = mitk::NavigationData::New(); + } mitk::NavigationDataDisplacementFilter::~NavigationDataDisplacementFilter() { } void mitk::NavigationDataDisplacementFilter::GenerateData() { /* update outputs with tracking data from tools */ - for (unsigned int i = 0; i < this->GetNumberOfOutputs() ; ++i) + if( !m_Transform6DOF ) + { + for (unsigned int i = 0; i < this->GetNumberOfOutputs() ; ++i) + { + mitk::NavigationData* output = this->GetOutput(i); + assert(output); + const mitk::NavigationData* input = this->GetInput(i); + assert(input); + + if (input->IsDataValid() == false) + { + output->SetDataValid(false); + continue; + } + output->Graft(input); // First, copy all information from input to output + output->SetPosition(input->GetPosition() + m_Offset); // Then change the member(s): add offset to position of navigation data + output->SetDataValid(true); // operation was successful, therefore data of output is valid. + // don't change anything else here + } + } + else { - mitk::NavigationData* output = this->GetOutput(i); - assert(output); - const mitk::NavigationData* input = this->GetInput(i); - assert(input); + if( this->GetNumberOfOutputs() != 2 ) + { + MITK_WARN << "TrackedUltrasound not possible. The number of tracked devices must be 2."; + return; + } + + //important: First device = Needle | Second device = US-Tracker + + mitk::NavigationData::Pointer needleOut = this->GetOutput(0); + const mitk::NavigationData* needleIn = this->GetInput(0); - if (input->IsDataValid() == false) + mitk::NavigationData::Pointer usTrackerOut = this->GetOutput(1); + const mitk::NavigationData* usTrackerIn = this->GetInput(1); + + if(needleIn->IsDataValid() == false ) { - output->SetDataValid(false); - continue; + needleOut->SetDataValid(false); } - output->Graft(input); // First, copy all information from input to output - output->SetPosition(input->GetPosition() + m_Offset); // Then change the member(s): add offset to position of navigation data - output->SetDataValid(true); // operation was successful, therefore data of output is valid. - // don't change anything else here + else + needleOut->Graft(needleIn); + + if (usTrackerIn->IsDataValid() == false) + { + usTrackerOut->SetDataValid(false); + } + else + usTrackerOut->Graft(usTrackerIn); + + needleOut->Compose( usTrackerOut->GetInverse(), false ); + needleOut->Compose( m_Transformation->GetInverse() ); + + usTrackerOut->SetDataValid(true); + needleOut->SetDataValid(true); } } +void mitk::NavigationDataDisplacementFilter::SetTransformation(mitk::AffineTransform3D::Pointer transform) +{ + mitk::NavigationData::Pointer transformation = mitk::NavigationData::New(transform); + m_Transformation = transformation; +} + void mitk::NavigationDataDisplacementFilter::SetParameters( const mitk::PropertyList* p ) { if (p == nullptr) return; mitk::Vector3D v; if (p->GetPropertyValue("NavigationDataDisplacementFilter_Offset", v) == true) // search for Offset parameter this->SetOffset(v); // apply if found; } mitk::PropertyList::ConstPointer mitk::NavigationDataDisplacementFilter::GetParameters() const { mitk::PropertyList::Pointer p = mitk::PropertyList::New(); p->SetProperty("NavigationDataDisplacementFilter_Offset", mitk::Vector3DProperty::New(this->GetOffset())); // store Offset parameter return mitk::PropertyList::ConstPointer(p); } diff --git a/Modules/IGT/Algorithms/mitkNavigationDataDisplacementFilter.h b/Modules/IGT/Algorithms/mitkNavigationDataDisplacementFilter.h index 0cbfa23854..91786cc5d1 100644 --- a/Modules/IGT/Algorithms/mitkNavigationDataDisplacementFilter.h +++ b/Modules/IGT/Algorithms/mitkNavigationDataDisplacementFilter.h @@ -1,76 +1,85 @@ /*=================================================================== 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 MITKNavigationDataDisplacementFilter_H_HEADER_INCLUDED_ #define MITKNavigationDataDisplacementFilter_H_HEADER_INCLUDED_ #include namespace mitk { /**Documentation * \brief NavigationDataDisplacementFilter adds an offset to navigation data objects * * Example class that shows how to write a navigation filter. This filter * adds a offset that can be specified as a parameter to each input navigation data. * * \ingroup IGT */ class MITKIGT_EXPORT NavigationDataDisplacementFilter : public NavigationDataToNavigationDataFilter { public: mitkClassMacro(NavigationDataDisplacementFilter, NavigationDataToNavigationDataFilter); itkFactorylessNewMacro(Self) itkCloneMacro(Self) mitkSetVectorMacro(Offset, mitk::Vector3D); ///< Get Offset parameter mitkGetVectorMacro(Offset, mitk::Vector3D); ///< Set Offset parameter + itkSetMacro(Transform6DOF, bool); + itkGetMacro(Transform6DOF, bool); + + void SetTransformation( mitk::AffineTransform3D::Pointer transform ); /** *\brief Set all filter parameters (Offset) as the PropertyList p * * This method reads the following properties from the PropertyList (name : data type): * - "NavigationDataDisplacementFilter_Offset" : mitk::Vector3DProperty */ virtual void SetParameters(const mitk::PropertyList* p) override; /** *\brief Get all filter parameters (offset) as a PropertyList * * This method returns a PropertyList containing the following * properties (name : data type): * - "NavigationDataDisplacementFilter_Offset" : mitk::Vector3DProperty * The returned PropertyList must be assigned to a * SmartPointer immediately, or else it will get destroyed. */ mitk::PropertyList::ConstPointer GetParameters() const override; protected: NavigationDataDisplacementFilter(); virtual ~NavigationDataDisplacementFilter(); /**Documentation * \brief filter execute method * * adds the offset m_Offset to all inputs */ virtual void GenerateData() override; mitk::Vector3D m_Offset; ///< offset that is added to all inputs + + bool m_Transform6DOF; + + mitk::NavigationData::Pointer m_Transformation; + }; } // namespace mitk #endif /* MITKNAVIGATIONDATATONAVIGATIONDATAFILTER_H_HEADER_INCLUDED_ */ diff --git a/Modules/US/USNavigation/files.cmake b/Modules/US/USNavigation/files.cmake index 8d3a527324..0b77d91b58 100644 --- a/Modules/US/USNavigation/files.cmake +++ b/Modules/US/USNavigation/files.cmake @@ -1,6 +1,7 @@ SET(CPP_FILES mitkUSCombinedModality.cpp + mitkTrackedUltrasound.cpp mitkAbstractUltrasoundTrackerDevice.cpp Filter/mitkNodeDisplacementFilter.cpp ) diff --git a/Modules/US/USNavigation/mitkTrackedUltrasound.cpp b/Modules/US/USNavigation/mitkTrackedUltrasound.cpp new file mode 100644 index 0000000000..ed9c2b777a --- /dev/null +++ b/Modules/US/USNavigation/mitkTrackedUltrasound.cpp @@ -0,0 +1,158 @@ +/*=================================================================== + +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 "mitkTrackedUltrasound.h" +#include "mitkImageReadAccessor.h" +#include +#include +#include "mitkTrackingDeviceSource.h" + +// US Control Interfaces +#include "mitkUSControlInterfaceProbes.h" +#include "mitkUSControlInterfaceBMode.h" +#include "mitkUSControlInterfaceDoppler.h" + + +mitk::TrackedUltrasound::TrackedUltrasound( USDevice::Pointer usDevice, + NavigationDataSource::Pointer trackingDevice, + bool trackedUltrasoundActive ) + : AbstractUltrasoundTrackerDevice( usDevice, trackingDevice, trackedUltrasoundActive ) +{ + +} + +mitk::TrackedUltrasound::~TrackedUltrasound() +{ + /*if (m_ServiceRegistration != nullptr) + { + m_ServiceRegistration.Unregister(); + } + m_ServiceRegistration = 0;*/ +} + +/*void mitk::TrackedUltrasound::UnregisterOnService() +{ + if (m_UltrasoundDevice->GetDeviceState() == USDevice::State_Activated) + { + m_UltrasoundDevice->Deactivate(); + } + if (m_UltrasoundDevice->GetDeviceState() == USDevice::State_Connected) + { + m_UltrasoundDevice->Disconnect(); + } + + if (m_ServiceRegistration != nullptr) + m_ServiceRegistration.Unregister(); + m_ServiceRegistration = 0; +}*/ + +/*void mitk::TrackedUltrasound::RegisterAsMicroservice() +{ + //Get Context + us::ModuleContext* context = us::GetModuleContext(); + + //Define ServiceProps + //us::ServiceProperties props; + mitk::UIDGenerator uidGen = + mitk::UIDGenerator("org.mitk.services.AbstractUltrasoundTrackerDevice", 16); + m_ServiceProperties[US_PROPKEY_ID] = uidGen.GetUID(); + m_ServiceProperties[US_PROPKEY_DEVICENAME] = m_UltrasoundDevice->GetName(); + m_ServiceProperties[US_PROPKEY_CLASS] = mitk::TrackedUltrasound::DeviceClassIdentifier; + + m_ServiceRegistration = context->RegisterService(this, m_ServiceProperties); +}*/ + +mitk::USAbstractControlInterface::Pointer mitk::TrackedUltrasound::GetControlInterfaceCustom() +{ + if (m_UltrasoundDevice.IsNull()) + { + MITK_ERROR("USCombinedModality")("USDevice") << "UltrasoundDevice must not be null."; + mitkThrow() << "UltrasoundDevice must not be null."; + } + + return m_UltrasoundDevice->GetControlInterfaceCustom(); +} + +mitk::USControlInterfaceBMode::Pointer mitk::TrackedUltrasound::GetControlInterfaceBMode() +{ + if (m_UltrasoundDevice.IsNull()) + { + MITK_ERROR("USCombinedModality")("USDevice") << "UltrasoundDevice must not be null."; + mitkThrow() << "UltrasoundDevice must not be null."; + } + + return m_UltrasoundDevice->GetControlInterfaceBMode(); +} + +mitk::USControlInterfaceProbes::Pointer mitk::TrackedUltrasound::GetControlInterfaceProbes() +{ + if (m_UltrasoundDevice.IsNull()) + { + MITK_ERROR("USCombinedModality")("USDevice") << "UltrasoundDevice must not be null."; + mitkThrow() << "UltrasoundDevice must not be null."; + } + + return m_UltrasoundDevice->GetControlInterfaceProbes(); +} + +mitk::USControlInterfaceDoppler::Pointer mitk::TrackedUltrasound::GetControlInterfaceDoppler() +{ + if (m_UltrasoundDevice.IsNull()) + { + MITK_ERROR("USCombinedModality")("USDevice") << "UltrasoundDevice must not be null."; + mitkThrow() << "UltrasoundDevice must not be null."; + } + + return m_UltrasoundDevice->GetControlInterfaceDoppler(); +} + + +void mitk::TrackedUltrasound::GenerateData() +{ + if (m_UltrasoundDevice->GetIsFreezed()) { return; } //if the image is freezed: do nothing + + //get next image from ultrasound image source + mitk::Image::Pointer image = m_UltrasoundDevice->GetUSImageSource()->GetNextImage(); + + if (image.IsNull() || !image->IsInitialized()) //check the image + { + MITK_WARN << "Invalid image in USCombinedModality, aborting!"; + return; + } + + //get output and initialize it if it wasn't initialized before + mitk::Image::Pointer output = this->GetOutput(); + if (!output->IsInitialized()) { output->Initialize(image); } + + //now update image data + mitk::ImageReadAccessor inputReadAccessor(image, image->GetSliceData(0, 0, 0)); + output->SetSlice(inputReadAccessor.GetData()); //copy image data + output->GetGeometry()->SetSpacing(image->GetGeometry()->GetSpacing()); //copy spacing because this might also change + + //and update calibration (= transformation of the image) + std::string calibrationKey = this->GetIdentifierForCurrentCalibration(); + if (!calibrationKey.empty()) + { + std::map::iterator calibrationIterator + = m_Calibrations.find(calibrationKey); + if (calibrationIterator != m_Calibrations.end()) + { + // transform image according to callibration if one is set + // for current configuration of probe and depth + this->GetOutput()->GetGeometry()->SetIndexToWorldTransform(calibrationIterator->second); + } + } +} diff --git a/Modules/US/USNavigation/mitkTrackedUltrasound.h b/Modules/US/USNavigation/mitkTrackedUltrasound.h new file mode 100644 index 0000000000..e6701a49d8 --- /dev/null +++ b/Modules/US/USNavigation/mitkTrackedUltrasound.h @@ -0,0 +1,106 @@ +/*=================================================================== + +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 __mitkTrackedUltrasound_h +#define __mitkTrackedUltrasound_h + +#include +#include "mitkUSDevice.h" +#include "mitkImageSource.h" +#include "mitkAbstractUltrasoundTrackerDevice.h" +#include "mitkNavigationDataSource.h" + +// Microservices +#include +#include + +namespace itk { + template class SmartPointer; +} + +namespace mitk { + class USControlInterfaceBMode; + class USControlInterfaceProbes; + class USControlInterfaceDoppler; + + /** + * \brief Combination of USDevice and NavigationDataSource. + * This class can be used as an ImageSource subclass. Additionally tracking data be + * retrieved from the NavigationDataSource returned by GetTrackingDevice(). + * + * A calibration of the ultrasound image stream to the navigation datas can be set + * for the currently active zoom level (of the ultrasound device) by SetCalibration(). + * The ultrasound images are transformed according to this calibration in the + * GenerateData() method. + */ + class MITKUSNAVIGATION_EXPORT TrackedUltrasound : public mitk::AbstractUltrasoundTrackerDevice + { + public: + + //void UnregisterOnService(); + + //void RegisterAsMicroservice() override; + + mitkClassMacro(TrackedUltrasound, mitk::AbstractUltrasoundTrackerDevice); + mitkNewMacro3Param(TrackedUltrasound, USDevice::Pointer, itk::SmartPointer, bool); + + + /** + * \brief Wrapper for returning custom control interface of the UltrasoundDevice. + */ + virtual itk::SmartPointer GetControlInterfaceCustom() override; + + /** + * \brief Wrapper for returning B mode control interface of the UltrasoundDevice. + */ + virtual itk::SmartPointer GetControlInterfaceBMode() override; + + /** + * \brief Wrapper for returning probes control interface of the UltrasoundDevice. + */ + virtual itk::SmartPointer GetControlInterfaceProbes() override; + + /** + * \brief Wrapper for returning doppler control interface of the UltrasoundDevice. + */ + virtual itk::SmartPointer GetControlInterfaceDoppler() override; + + protected: + TrackedUltrasound( USDevice::Pointer usDevice, + itk::SmartPointer trackingDevice, + bool trackedUltrasoundActive = true ); + virtual ~TrackedUltrasound(); + + /** + * \brief Grabs the next frame from the input. + * This method is called internally, whenever Update() is invoked by an Output. + */ + void GenerateData() override; + + + private: + /** + * \brief The device's ServiceRegistration object that allows to modify it's Microservice registraton details. + */ + //us::ServiceRegistration m_ServiceRegistration; + + /** + * \brief Properties of the device's Microservice. + */ + //us::ServiceProperties m_ServiceProperties; + }; +} // namespace mitk +#endif // __mitkTrackedUltrasound_h