20 m_Segmentation(nullptr),
21 m_TransformMarkerCSToSensorCS(
mitk::AffineTransform3D::New()),
22 m_TransformMarkerCSToFloatingImageCS(
mitk::AffineTransform3D::New()),
23 m_TransformUSimageCSToTrackingCS(
mitk::AffineTransform3D::New()),
24 m_TransformCTimageIndexToWorld(
mitk::AffineTransform3D::New()),
25 m_TrackedUltrasoundActive(false)
27 m_SurfaceGeometry = mitk::Geometry3D::New();
29 m_CTimage = mitk::Image::New();
40 m_TransformMarkerCSToSensorCS = mitk::AffineTransform3D::New();
44 MITK_INFO <<
"Use NDI disc tracker for performing the CT-to-US-registration";
45 mitk::Vector3D translationNDI;
46 translationNDI[0] = 15.000;
47 translationNDI[1] = 8.000;
48 translationNDI[2] = -2.500;
51 m_TransformMarkerCSToSensorCS->SetOffset(translationNDI);
54 mitk::Quaternion qNDI(0, 0, 1, 0);
56 vnl_matrix_fixed<double, 3, 3> vnl_rotation = qNDI.rotation_matrix_transpose().transpose();
57 mitk::Matrix3D rotationMatrix;
59 for (
int i = 0; i < 3; ++i) {
60 for (
int j = 0; j < 3; ++j) {
61 rotationMatrix[i][j] = vnl_rotation[i][j];
65 m_TransformMarkerCSToSensorCS->SetMatrix(rotationMatrix);
69 MITK_INFO <<
"Use Polhemus RX2 tracker for performing the CT-to-US-registration";
70 mitk::Vector3D translationPolhemus;
71 translationPolhemus[0] = -18.175;
72 translationPolhemus[1] = 15.000;
73 translationPolhemus[2] = 10.501;
77 m_TransformMarkerCSToSensorCS->SetOffset(translationPolhemus);
80 mitk::Quaternion q1(1, 0, 0, 0);
82 vnl_matrix_fixed<double, 3, 3> vnl_rotation = q1.rotation_matrix_transpose().transpose();
83 mitk::Matrix3D rotationMatrix;
85 for (
int i = 0; i < 3; ++i) {
86 for (
int j = 0; j < 3; ++j) {
87 rotationMatrix[i][j] = vnl_rotation[i][j];
91 m_TransformMarkerCSToSensorCS->SetMatrix(rotationMatrix);
126 Superclass::GenerateData();
128 if (m_TrackedUltrasoundActive)
130 MITK_WARN <<
"The CT-to-US-registration is not supported by tracked ultrasound, yet.";
135 mitk::NavigationData::Pointer transformSensorCSToTracking = this->GetOutput(0);
138 if (!transformSensorCSToTracking->IsDataValid())
144 mitk::AffineTransform3D::Pointer totalTransformation = mitk::AffineTransform3D::New();
145 totalTransformation->SetIdentity();
147 totalTransformation->Compose(this->GetInverseTransform(m_TransformMarkerCSToFloatingImageCS));
149 totalTransformation->Compose(m_TransformMarkerCSToSensorCS);
151 totalTransformation->Compose(transformSensorCSToTracking->GetAffineTransform3D());
153 totalTransformation->Modified();
164 m_Surface->GetData()->GetGeometry()->SetIndexToWorldTransform(totalTransformation);
165 m_Surface->Modified();
167 m_PointSet->GetData()->GetGeometry()->SetIndexToWorldTransform(totalTransformation);
168 m_PointSet->Modified();
173 mitk::AffineTransform3D::Pointer inverseTransform = mitk::AffineTransform3D::New();
174 mitk::AffineTransform3D::Pointer inverse =
dynamic_cast<mitk::AffineTransform3D*
>(transform->GetInverseTransform().GetPointer());
178 if (inverse.IsNull())
180 MITK_WARN <<
"Could not get inverse transform of mitk::AffineTransform3D. Returning nullptr";
184 inverseTransform->SetOffset(inverse->GetOffset());
185 inverseTransform->SetMatrix(inverse->GetMatrix());
187 return inverseTransform;