54,m_PermanentRegistrationFilter(nullptr)
56,m_VirtualView(nullptr)
57,m_PSRecordingPointSet(nullptr)
58,m_PointSetRecording(false)
59,m_PermanentRegistration(false)
61,m_ImageFiducialsDataNode(nullptr)
62,m_TrackerFiducialsDataNode(nullptr)
63,m_PermanentRegistrationSourcePoints(nullptr)
204 for (
int i=0; i<imageFiducials->GetSize(); i++)
206 double point[3] = {imageFiducials->GetPoint(i)[0],imageFiducials->GetPoint(i)[1],imageFiducials->GetPoint(i)[2]};
207 sourcePoints->InsertNextPoint(point);
208 double point_targets[3] = {trackerFiducials->GetPoint(i)[0],trackerFiducials->GetPoint(i)[1],trackerFiducials->GetPoint(i)[2]};
209 targetPoints->InsertNextPoint(point_targets);
215 transform->SetSourceLandmarks(sourcePoints);
216 transform->SetTargetLandmarks(targetPoints);
217 transform->SetModeToRigidBody();
218 transform->Modified();
222 m_Controls.m_RegistrationWidget->SetQualityDisplayText(
"FRE: " + QString::number(FRE) +
" mm");
227 itk::Matrix<float,3,3> rotationFloat = itk::Matrix<float,3,3>();
228 itk::Vector<float,3> translationFloat = itk::Vector<float,3>();
229 itk::Matrix<double,3,3> rotationDouble = itk::Matrix<double,3,3>();
230 itk::Vector<double,3> translationDouble = itk::Vector<double,3>();
233 for(
int k=0; k<3; k++)
for(
int l=0; l<3; l++)
235 rotationFloat[k][l] = m->GetElement(k,l);
236 rotationDouble[k][l] = m->GetElement(k,l);
239 for(
int k=0; k<3; k++)
241 translationFloat[k] = m->GetElement(k,3);
242 translationDouble[k] = m->GetElement(k,3);
245 mitk::AffineTransform3D::Pointer mitkTransform = mitk::AffineTransform3D::New();
246 mitkTransform->SetMatrix(rotationDouble);
247 mitkTransform->SetOffset(translationDouble);
255 if(
m_Controls.m_SurfaceActive->isChecked() &&
m_Controls.m_ObjectComboBox->GetSelectedNode().IsNotNull())
257 m_Controls.m_ObjectComboBox->GetSelectedNode()->GetData()->GetGeometry()->SetIndexToWorldTransform(mitkTransform);
264 if(
m_Controls.m_ImageActive->isChecked() &&
m_Controls.m_ImageComboBox->GetSelectedNode().IsNotNull())
267 mitk::AffineTransform3D::Pointer imageTransform =
m_Controls.m_ImageComboBox->GetSelectedNode()->GetData()->GetGeometry()->GetIndexToWorldTransform();
271 imageTransform->Compose(mitkTransform);
272 mitk::AffineTransform3D::Pointer newImageTransform = mitk::AffineTransform3D::New();
273 itk::Matrix<mitk::ScalarType,3,3> rotationFloatNew = imageTransform->GetMatrix();
274 itk::Vector<mitk::ScalarType,3> translationFloatNew = imageTransform->GetOffset();
275 newImageTransform->SetMatrix(rotationFloatNew);
276 newImageTransform->SetOffset(translationFloatNew);
277 m_Controls.m_ImageComboBox->GetSelectedNode()->GetData()->GetGeometry()->SetIndexToWorldTransform(newImageTransform);
278 m_T_ImageReg =
m_Controls.m_ImageComboBox->GetSelectedNode()->GetData()->GetGeometry()->GetIndexToWorldTransform();
307 mitk::DataStorage* ds = this->GetDataStorage();
313 foreach(QmitkRenderWindow* renderWindow, this->GetRenderWindowPart(mitk::WorkbenchUtil::OPEN)->GetQmitkRenderWindows().values())
315 m_Controls.m_RegistrationWidget->AddSliceNavigationController(renderWindow->GetSliceNavigationController());
321 mitk::PointSet::Pointer ifPS = mitk::PointSet::New();
326 color.Set(1.0f, 0.0f, 0.0f);
338 mitk::PointSet::Pointer tfPS = mitk::PointSet::New();
342 color.Set(0.0f, 1.0f, 0.0f);
370 m_Controls.m_UsePermanentRegistrationToggle->setChecked(
false);
375 mitk::AffineTransform3D::Pointer transform = this->
m_Controls.m_ObjectComboBox->GetSelectedNode()->GetData()->GetGeometry()->GetIndexToWorldTransform();
376 mitk::NavigationData::Pointer T_Object = mitk::NavigationData::New(transform,
false);
379 this->
m_Controls.m_ObjectComboBox->GetSelectedNode()->GetData()->GetGeometry()->SetIdentity();
380 if(
m_Controls.m_ImageActive->isChecked()) {this->
m_Controls.m_ImageComboBox->GetSelectedNode()->GetData()->GetGeometry()->SetIndexToWorldTransform(
m_T_ImageGeo);}
399 mitk::NavigationData::Pointer T_MarkerRel = mitk::NavigationData::New();
400 T_MarkerRel->Compose(T_Object);
401 T_MarkerRel->Compose(T_Marker->GetInverse());
408 if (
m_Controls.m_ImageActive->isChecked() && (
m_Controls.m_ImageComboBox->GetSelectedNode().IsNotNull()))
410 mitk::DataNode::Pointer imageNode = this->
m_Controls.m_ImageComboBox->GetSelectedNode();
411 imageNode->AddProperty(
"reslice interpolation", mitk::VtkResliceInterpolationProperty::New(VTK_RESLICE_LINEAR) );
419 mitk::AffineTransform3D::Pointer T_ImageRel = mitk::AffineTransform3D::New();
420 T_ImageRel->SetIdentity();
436 if(
m_T_ObjectReg.IsNotNull()) {this->
m_Controls.m_ObjectComboBox->GetSelectedNode()->GetData()->GetGeometry()->SetIndexToWorldTransform(
m_T_ObjectReg->GetAffineTransform3D());}
497if (
m_Controls.m_CameraViewSelection->GetSelectedToolID() == -1)
499 m_Controls.m_ActivateNeedleView->setChecked(
false);
500 QMessageBox::warning(
nullptr,
"Error",
"No tool selected for camera view!");
509 mitk::Vector3D viewDirection;
510 viewDirection[0] = (int)(
m_Controls.m_NeedleViewX->isChecked());
511 viewDirection[1] = (int)(
m_Controls.m_NeedleViewY->isChecked());
512 viewDirection[2] = (int)(
m_Controls.m_NeedleViewZ->isChecked());
513 if (
m_Controls.m_NeedleViewInvert->isChecked()) viewDirection *= -1;
514 m_VirtualView->SetDirectionOfProjectionInToolCoordinates(viewDirection);
516 mitk::Vector3D viewUpVector;
517 viewUpVector[0] = (int)(
m_Controls.m_NeedleUpX->isChecked());
518 viewUpVector[1] = (int)(
m_Controls.m_NeedleUpY->isChecked());
519 viewUpVector[2] = (int)(
m_Controls.m_NeedleUpZ->isChecked());
520 if (
m_Controls.m_NeedleUpInvert->isChecked()) viewUpVector *= -1;
523 m_VirtualView->SetRenderer(this->GetRenderWindowPart(mitk::WorkbenchUtil::OPEN)->GetQmitkRenderWindow(
"3d")->GetRenderer());
529 m_Controls.m_CameraViewSelection->GetSelectedNavigationTool()->GetDataNode()->SetBoolProperty(
"visible",
false);
532 m_Controls.m_ViewDirectionBox->setEnabled(
false);
539 m_Controls.m_CameraViewSelection->GetSelectedNavigationTool()->GetDataNode()->SetBoolProperty(
"visible",
true);
541 m_Controls.m_ViewDirectionBox->setEnabled(
true);
584 connect(
m_Controls.m_TrackingDeviceSelectionWidget, SIGNAL(NavigationDataSourceSelected(mitk::NavigationDataSource::Pointer)),
this, SLOT(
OnSetupNavigation()) );
596 m_Controls.m_ObjectComboBox->SetDataStorage(this->GetDataStorage());
597 m_Controls.m_ObjectComboBox->SetAutoSelectNewItems(
false);
598 m_Controls.m_ObjectComboBox->SetPredicate(mitk::NodePredicateDataType::New(
"Surface"));
600 m_Controls.m_ImageComboBox->SetDataStorage(this->GetDataStorage());
601 m_Controls.m_ImageComboBox->SetAutoSelectNewItems(
false);
602 m_Controls.m_ImageComboBox->SetPredicate(mitk::NodePredicateDataType::New(
"Image"));
634 std::string warningMessage =
"";
635 bool initializationErrorDetected =
false;
636 mitk::PointSet::Pointer imageFiducials,trackerFiducials;
641 warningMessage =
"Initialization not finished!";
642 MITK_WARN << warningMessage;
643 QMessageBox::warning(
nullptr,
"Registration not possible", warningMessage.c_str());
653 if (
m_Controls.m_SurfaceActive->isChecked() &&
m_Controls.m_ObjectComboBox->GetSelectedNode().IsNull())
655 warningMessage =
"No surface selected for registration.\nRegistration is not possible";
656 initializationErrorDetected =
true;
658 else if (
m_Controls.m_ImageActive->isChecked() &&
m_Controls.m_ImageComboBox->GetSelectedNode().IsNull())
660 warningMessage =
"No image selected for registration.\nRegistration is not possible";
661 initializationErrorDetected =
true;
663 else if (imageFiducials.IsNull() || trackerFiducials.IsNull())
665 warningMessage =
"Fiducial data objects not found. \n"
666 "Please set 3 or more fiducials in the image and with the tracking system.\n\n"
667 "Registration is not possible";
668 initializationErrorDetected =
true;
670 else if ((imageFiducials->GetSize() < 3) || (trackerFiducials->GetSize() < 3) || (imageFiducials->GetSize() != trackerFiducials->GetSize()))
672 warningMessage =
"Not enough fiducial pairs found. At least 3 fiducial must exist for the image and the tracking system respectively.";
673 initializationErrorDetected =
true;
677 if(initializationErrorDetected)
679 MITK_WARN << warningMessage;
680 QMessageBox::warning(
nullptr,
"Registration not possible", warningMessage.c_str());
690 if(transformA.IsNull() || transformA.IsNull())
692 mitk::Point3D posA,posB;
693 posA = transformA->GetPosition();
694 posB = transformB->GetPosition();
697 if(posA.EuclideanDistanceTo(posB) > euclideanDistanceThreshold)
701 mitk::Quaternion rotA,rotB;
702 rotA = transformA->GetOrientation();
703 rotB = transformB->GetOrientation();
705 itk::Vector<double,3> point;
713 itk::Matrix<double,3,3> rotMatrixA;
714 for(
int i=0; i<3; i++)
for(
int j=0; j<3; j++) rotMatrixA[i][j] = rotA.rotation_matrix_transpose().transpose()[i][j];
716 itk::Matrix<double,3,3> rotMatrixB;
717 for(
int i=0; i<3; i++)
for(
int j=0; j<3; j++) rotMatrixB[i][j] = rotB.rotation_matrix_transpose().transpose()[i][j];
719 itk::Vector<double,3> pt1 = rotMatrixA * point;
720 itk::Vector<double,3> pt2 = rotMatrixB * point;
722 returnValue = (pt1[0]*pt2[0]+pt1[1]*pt2[1]+pt1[2]*pt2[2]) / ( sqrt(pow(pt1[0],2.0)+pow(pt1[1],2.0)+pow(pt1[2],2.0)) * sqrt(pow(pt2[0],2.0)+pow(pt2[1],2.0)+pow(pt2[2],2.0)));
723 returnValue = acos(returnValue);
725 if(returnValue*57.3 > angularDifferenceThreshold){
return true;}