15 #include <vtkTransform.h> 16 #include <vtkTransformPolyDataFilter.h> 17 #include <vtkAppendPolyData.h> 18 #include <vtkPoints.h> 19 #include <vtkLandmarkTransform.h> 24 #define FRW_LOG MITK_INFO("Fiducial Registration Widget") 25 #define FRW_WARN MITK_WARN("Fiducial Registration Widget") 26 #define FRW_DEBUG MITK_DEBUG("Fiducial Registration Widget") 30 : QWidget(parent), m_Controls(nullptr),m_MultiWidget(nullptr), m_ImageFiducialsNode(nullptr), m_TrackerFiducialsNode(nullptr)
54 m_Controls =
new Ui::QmitkFiducialRegistrationWidget;
58 m_Controls->m_AddImageFiducialBtn->setHidden(
true);
60 m_Controls->m_spaceHolderGroupBox->setStyleSheet(
"QGroupBox {border: 0px transparent;}");
61 m_Controls->m_spaceHolderGroupBox2->setStyleSheet(
"QGroupBox {border: 0px transparent;}");
74 connect((QObject*)(
m_Controls->m_RegisterFiducialsBtn), SIGNAL(clicked()),
this, SLOT(
Register()));
84 if (activated)
m_Controls->m_RegistrationImagePoints->UnselectEditButton();
88 if (activated)
m_Controls->m_RegistrationTrackingPoints->UnselectEditButton();
100 this->
m_Controls->sourceLandmarksGroupBox->setTitle(
"Target/Reference landmarks");
101 this->
m_Controls->targetLandmarksGroupBox->setTitle(
"Source Landmarks");
102 this->
m_Controls->m_AddImageFiducialBtn->setText(
"Add target landmark");
103 this->
m_Controls->m_AddTrackingFiducialBtn->setText(
"Add source landmark");
112 this->
m_Controls->sourceLandmarksGroupBox->setTitle(
"Image fiducials");
113 this->
m_Controls->targetLandmarksGroupBox->setTitle(
"OR fiducials");
114 this->
m_Controls->m_AddImageFiducialBtn->setText(
"Add image fiducial");
115 this->
m_Controls->m_AddTrackingFiducialBtn->setText(
"Add current instrument position");
123 m_Controls->m_RegistrationQualityDisplay->setText(text);
128 if(
m_Controls->m_UseICPRegistration->isChecked())
136 if(imageFiducialsNode.IsNull())
138 FRW_WARN<<
"tracker fiducial node is nullptr";
141 m_Controls->m_RegistrationImagePoints->SetPointSetNode(imageFiducialsNode);
152 if(trackerFiducialsNode.IsNull())
154 FRW_WARN<<
"tracker fiducial node is nullptr";
157 m_Controls->m_RegistrationTrackingPoints->SetPointSetNode(trackerFiducialsNode);
173 m_Controls->m_RegistrationTrackingPoints->AddSliceNavigationController(snc);
174 m_Controls->m_RegistrationImagePoints->AddSliceNavigationController(snc);
189 m_Controls->m_rbStaticRegistration->setHidden(on);
195 m_Controls->m_rbContinousRegistration->setHidden(on);
201 if (
m_Controls->m_rbStaticRegistration->isHidden() &&
m_Controls->m_rbContinousRegistration->isHidden())
203 m_Controls->m_gbFiducialRegistration->setHidden(
true);
207 m_Controls->m_gbFiducialRegistration->setHidden(
false);
213 m_Controls->m_UseICPRegistration->setHidden(on);
218 m_Controls->m_AddImageFiducialBtn->setHidden(on);
225 m_Controls->m_AddTrackingFiducialBtn->setHidden(on);
231 if (
m_Controls->m_AddImageFiducialBtn->isHidden() &&
m_Controls->m_AddTrackingFiducialBtn->isHidden())
233 m_Controls->m_spaceHolderGroupBox->setHidden(
true);
234 m_Controls->m_spaceHolderGroupBox2->setHidden(
true);
238 m_Controls->m_spaceHolderGroupBox->setHidden(
false);
239 m_Controls->m_spaceHolderGroupBox2->setHidden(
false);
245 QString groupBoxTitle = sourceLandmarkName;
246 groupBoxTitle.append(
" Landmarks");
247 m_Controls->sourceLandmarksGroupBox->setTitle(groupBoxTitle);
248 QString buttonText =
"Add ";
249 buttonText.append(sourceLandmarkName);
250 buttonText.append(
" Landmark");
251 m_Controls->m_AddImageFiducialBtn->setText(buttonText);
256 QString groupBoxTitle = targetLandmarkName;
257 groupBoxTitle.append(
" Landmarks");
258 m_Controls->targetLandmarksGroupBox->setTitle(groupBoxTitle);
259 QString buttonText =
"Add ";
260 buttonText.append(targetLandmarkName);
261 buttonText.append(
" Landmark");
262 m_Controls->m_AddTrackingFiducialBtn->setText(buttonText);
281 ImageFiducialsNode->SetData(imagePointSet);
282 ImageFiducialsNode->SetName(
"Image Point Set");
289 TrackerFiducialsNode->SetData(trackerPointSet);
290 TrackerFiducialsNode->SetName(
"Tracker Point Set");
309 ) {
MITK_WARN <<
"Registration not correctly initialized";
return false;}
321 if (trackerFiducials->GetSize() != imageFiducials->GetSize())
323 MITK_WARN <<
"Not the same number of fiducials, cannot register";
326 else if (trackerFiducials->GetSize() < 3)
328 MITK_WARN <<
"Need at least 3 fiducials, cannot register";
334 vtkSmartPointer<vtkPoints> sourcePoints = vtkSmartPointer<vtkPoints>::New();
335 vtkSmartPointer<vtkPoints> targetPoints = vtkSmartPointer<vtkPoints>::New();
336 for (
int i = 0; i<imageFiducials->GetSize(); i++)
338 double point[3] = { imageFiducials->GetPoint(i)[0], imageFiducials->GetPoint(i)[1], imageFiducials->GetPoint(i)[2] };
339 sourcePoints->InsertNextPoint(point);
340 double point_targets[3] = { trackerFiducials->GetPoint(i)[0], trackerFiducials->GetPoint(i)[1], trackerFiducials->GetPoint(i)[2] };
341 targetPoints->InsertNextPoint(point_targets);
346 vtkSmartPointer<vtkLandmarkTransform> transform = vtkSmartPointer<vtkLandmarkTransform>::New();
347 transform->SetSourceLandmarks(sourcePoints);
348 transform->SetTargetLandmarks(targetPoints);
349 transform->SetModeToRigidBody();
350 transform->Modified();
361 itk::Matrix<float, 3, 3> rotationFloat = itk::Matrix<float, 3, 3>();
362 itk::Vector<float, 3> translationFloat = itk::Vector<float, 3>();
363 itk::Matrix<double, 3, 3> rotationDouble = itk::Matrix<double, 3, 3>();
364 itk::Vector<double, 3> translationDouble = itk::Vector<double, 3>();
366 vtkSmartPointer<vtkMatrix4x4> m = transform->GetMatrix();
367 for (
int k = 0;
k<3;
k++)
for (
int l = 0; l<3; l++)
369 rotationFloat[
k][l] = m->GetElement(
k, l);
370 rotationDouble[
k][l] = m->GetElement(
k, l);
373 for (
int k = 0;
k<3;
k++)
375 translationFloat[
k] = m->GetElement(
k, 3);
376 translationDouble[
k] = m->GetElement(
k, 3);
379 mitk::AffineTransform3D::Pointer mitkTransform = mitk::AffineTransform3D::New();
380 mitkTransform->SetMatrix(rotationDouble);
381 mitkTransform->SetOffset(translationDouble);
393 mitk::AffineTransform3D::Pointer imageTransform =
m_ImageNode->GetData()->GetGeometry()->GetIndexToWorldTransform();
394 imageTransform->Compose(mitkTransform);
395 mitk::AffineTransform3D::Pointer newImageTransform = mitk::AffineTransform3D::New();
396 itk::Matrix<mitk::ScalarType, 3, 3> rotationFloatNew = imageTransform->GetMatrix();
397 itk::Vector<mitk::ScalarType, 3> translationFloatNew = imageTransform->GetOffset();
398 newImageTransform->SetMatrix(rotationFloatNew);
399 newImageTransform->SetOffset(translationFloatNew);
400 m_ImageNode->GetData()->GetGeometry()->SetIndexToWorldTransform(newImageTransform);
404 if (this->
m_Controls->m_MoveImagePoints->isChecked())
409 for (
int i = 0; i < pointSet_orig->
GetSize(); i++)
411 pointSet_moved->InsertPoint(mitkTransform->TransformPoint(pointSet_orig->
GetPoint(i)));
414 pointSet_orig->
Clear();
415 for (
int i = 0; i < pointSet_moved->GetSize(); i++)
416 pointSet_orig->
InsertPoint(pointSet_moved->GetPoint(i));
Controls the selection of the slice the associated BaseRenderer will display.
virtual int GetSize(unsigned int t=0) const
returns the current size of the point-list
Data structure which stores a set of points. Superclass of mitk::Mesh.
static RenderingManager * GetInstance()
static double ComputeFRE(mitk::PointSet::Pointer imageFiducials, mitk::PointSet::Pointer realWorldFiducials, vtkSmartPointer< vtkLandmarkTransform > transform=nullptr)
Computes the fiducial registration error out of two sets of fiducials. The two sets must have the sam...
void InsertPoint(PointIdentifier id, PointType point, int t=0)
Set the given point in world coordinate system into the itkPointSet.
virtual void Clear()
Calls ClearData() and InitializeEmpty();.
PointType GetPoint(PointIdentifier id, int t=0) const
Get the point with ID id in world coordinates.
virtual void InitializeViewsByBoundingObjects(const DataStorage *)
Initializes the renderwindows by the aggregated geometry of all objects that are held in the data sto...