00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "mitkNavigationDataReferenceTransformFilter.h"
00019
00020
00021 mitk::NavigationDataReferenceTransformFilter::NavigationDataReferenceTransformFilter() : mitk::NavigationDataToNavigationDataFilter(),
00022 m_SourcePoints (NULL),
00023 m_TargetPoints (NULL),
00024 m_ReferencePoints (NULL),
00025 m_LandmarkTransformInitializer (NULL),
00026 m_LandmarkTransform (NULL),
00027 m_OneSourceRegistration (false),
00028 m_ReferenceRegistration (false)
00029 {
00030
00031 m_LandmarkTransform = LandmarkTransformType::New();
00032 m_LandmarkTransformInitializer = TransformInitializerType::New();
00033 m_LandmarkTransformInitializer->SetTransform(m_LandmarkTransform);
00034
00035 m_QuaternionTransform = QuaternionTransformType::New();
00036 m_QuaternionLandmarkTransform = QuaternionTransformType::New();
00037 m_QuaternionReferenceTransform = QuaternionTransformType::New();
00038 }
00039
00040 mitk::NavigationDataReferenceTransformFilter::~NavigationDataReferenceTransformFilter()
00041 {
00042 m_LandmarkTransform = NULL;
00043 m_LandmarkTransformInitializer = NULL;
00044 m_QuaternionTransform = NULL;
00045 m_QuaternionLandmarkTransform = NULL;
00046 m_QuaternionReferenceTransform = NULL;
00047 }
00048
00049
00050 void mitk::NavigationDataReferenceTransformFilter::ResetFilter()
00051 {
00052 m_OneSourceRegistration = false;
00053 m_ReferenceRegistration = false;
00054
00055 m_SourcePoints.clear();
00056 m_TargetPoints.clear();
00057 m_ReferencePoints.clear();
00058
00059 this->CreateOutputsForAllInputs();
00060
00061
00062 }
00063
00064
00065 void mitk::NavigationDataReferenceTransformFilter::GenerateData()
00066 {
00067 LandmarkPointContainer newSourcePoints;
00068
00069 if(m_OneSourceRegistration)
00070 {
00071 NavigationData::ConstPointer nd = this->GetInput(m_ReferenceInputIndexes.at(0));
00072
00073 if (nd->IsDataValid() == false)
00074 {
00075 for (unsigned int i = 0; i < this->GetNumberOfOutputs() ; ++i)
00076 {
00077 mitk::NavigationData::Pointer output = this->GetOutput(i);
00078 assert(output);
00079 output->SetDataValid(false);
00080 }
00081 return;
00082 }
00083
00084 QuaternionTransformType::Pointer referenceTransform = QuaternionTransformType::New();
00085 QuaternionTransformType::VnlQuaternionType doubleOrientation(nd->GetOrientation().x(), nd->GetOrientation().y(), nd->GetOrientation().z(), nd->GetOrientation().r());
00086
00087 referenceTransform->SetRotation(doubleOrientation);
00088 referenceTransform->SetOffset(nd->GetPosition().GetVectorFromOrigin());
00089 referenceTransform->Modified();
00090
00091 for (NavigationDataReferenceTransformFilter::LandmarkPointContainer::const_iterator it = m_ReferencePoints.begin(); it != m_ReferencePoints.end(); ++it)
00092 {
00093 TransformInitializerType::LandmarkPointType rLPoint;
00094 rLPoint = referenceTransform->TransformPoint(*it);
00095 newSourcePoints.push_back(rLPoint);
00096 }
00097
00098 this->UpdateLandmarkTransform(newSourcePoints, m_TargetPoints);
00099 m_SourcePoints = newSourcePoints;
00100 }
00101
00102
00103 if(this->IsInitialized() && !m_OneSourceRegistration && m_ReferenceRegistration)
00104 this->GenerateSourceLandmarks();
00105
00106
00107 this->CreateOutputsForAllInputs();
00108
00109 TransformInitializerType::LandmarkPointType lPointIn, lPointOut;
00110
00111 for(unsigned int i = 0; i < this->GetNumberOfOutputs(); i++)
00112 {
00113 mitk::NavigationData::Pointer output = this->GetOutput(i);
00114 assert(output);
00115 mitk::NavigationData::ConstPointer input = this->GetInput(i);
00116 assert(input);
00117
00118 if(input->IsDataValid() == false)
00119 {
00120 output->SetDataValid(false);
00121 continue;
00122 }
00123 output->Graft(input);
00124
00125
00126 if(this->IsInitialized() == false)
00127 continue;
00128
00129 mitk::NavigationData::PositionType tempCoordinate;
00130 tempCoordinate = input->GetPosition();
00131
00132 lPointIn[0] = tempCoordinate[0];
00133 lPointIn[1] = tempCoordinate[1];
00134 lPointIn[2] = tempCoordinate[2];
00135
00136
00137 lPointOut = m_LandmarkTransform->TransformPoint(lPointIn);
00138
00139 tempCoordinate[0] = lPointOut[0];
00140 tempCoordinate[1] = lPointOut[1];
00141 tempCoordinate[2] = lPointOut[2];
00142
00143 output->SetPosition(tempCoordinate);
00144
00145
00146 NavigationData::OrientationType quatIn = input->GetOrientation();
00147 vnl_quaternion<double> const vnlQuatIn(quatIn.x(), quatIn.y(), quatIn.z(), quatIn.r());
00148 m_QuaternionTransform->SetRotation(vnlQuatIn);
00149
00150
00151 m_QuaternionLandmarkTransform->SetMatrix(m_LandmarkTransform->GetRotationMatrix());
00152 m_QuaternionLandmarkTransform->Compose(m_QuaternionTransform, true);
00153
00154
00155 vnl_quaternion<double> vnlQuatOut = m_QuaternionLandmarkTransform->GetRotation();
00156 NavigationData::OrientationType quatOut( vnlQuatOut[0], vnlQuatOut[1], vnlQuatOut[2], vnlQuatOut[3]);
00157
00158 output->SetOrientation(quatOut);
00159 output->SetDataValid(true);
00160
00161 }
00162 }
00163
00164
00165 const mitk::NavigationDataReferenceTransformFilter::LandmarkPointContainer mitk::NavigationDataReferenceTransformFilter::GenerateReferenceLandmarks()
00166 {
00167 LandmarkPointContainer lPoints;
00168
00169 if(!m_ReferenceInputIndexes.empty())
00170 {
00171 TransformInitializerType::LandmarkPointType lPoint;
00172
00173 if(m_ReferenceInputIndexes.size() < 3)
00174 {
00175 NavigationData::ConstPointer nD = this->GetInput(m_ReferenceInputIndexes.at(0));
00176 NavigationData::PositionType pos = nD->GetPosition();
00177
00178
00179 mitk::FillVector3D(lPoint, pos.GetElement(0), pos.GetElement(1), pos.GetElement(2));
00180 lPoints.push_back(lPoint);
00181
00182
00183 mitk::FillVector3D(lPoint, pos.GetElement(0), pos.GetElement(1)+100, pos.GetElement(2));
00184 lPoints.push_back(lPoint);
00185
00186
00187 mitk::FillVector3D(lPoint, pos.GetElement(0), pos.GetElement(1), pos.GetElement(2)+100);
00188 lPoints.push_back(lPoint);
00189 }
00190
00191
00192 else if(m_ReferenceInputIndexes.size()>2)
00193 {
00194 for(unsigned int i=0; i<m_ReferenceInputIndexes.size(); ++i)
00195 {
00196 NavigationData::ConstPointer nD = this->GetInput(m_ReferenceInputIndexes.at(i));
00197 NavigationData::PositionType pos = nD->GetPosition();
00198 mitk::FillVector3D(lPoint, pos.GetElement(0), pos.GetElement(1), pos.GetElement(2));
00199 lPoints.push_back(lPoint);
00200 }
00201 }
00202
00203 }
00204
00205 return lPoints;
00206 }
00207
00208 void mitk::NavigationDataReferenceTransformFilter::GenerateSourceLandmarks()
00209 {
00210 m_ReferenceRegistration = true;
00211
00212 m_SourcePoints.clear();
00213 m_SourcePoints = this->GenerateReferenceLandmarks();
00214
00215 if(this->IsInitialized())
00216 this->UpdateLandmarkTransform(m_SourcePoints, m_TargetPoints);
00217 }
00218
00219
00220 void mitk::NavigationDataReferenceTransformFilter::GenerateTargetLandmarks()
00221 {
00222 m_ReferenceRegistration = true;
00223
00224 m_TargetPoints.clear();
00225 m_TargetPoints = this->GenerateReferenceLandmarks();
00226
00227 if(this->IsInitialized())
00228 this->UpdateLandmarkTransform(m_SourcePoints, m_TargetPoints);
00229 }
00230
00231
00232
00233
00234 bool mitk::NavigationDataReferenceTransformFilter::InitializeReferenceLandmarks()
00235 {
00236
00237 if (m_ReferenceInputIndexes.size() != 1 || (m_SourcePoints.size() < 3) || (m_ReferenceInputIndexes.size() <= 0) || m_ReferenceInputIndexes.size() > this->GetNumberOfInputs())
00238 return false;
00239
00240 mitk::NavigationData::ConstPointer referenceND = this->GetInput(m_ReferenceInputIndexes.at(0));
00241
00242 if(!referenceND->IsDataValid())
00243 return false;
00244
00245 QuaternionTransformType::Pointer referenceTransform = QuaternionTransformType::New();
00246 QuaternionTransformType::VnlQuaternionType doubleOrientation(referenceND->GetOrientation().x(), referenceND->GetOrientation().y(),referenceND->GetOrientation().z(),referenceND->GetOrientation().r());
00247
00248 referenceTransform->SetRotation(doubleOrientation);
00249 referenceTransform->SetOffset(referenceND->GetPosition().GetVectorFromOrigin());
00250 referenceTransform->Modified();
00251
00252 try
00253 {
00254 bool okay = referenceTransform->GetInverse(m_QuaternionReferenceTransform);
00255 if(!okay)
00256 return false;
00257 }
00258 catch( ... )
00259 {
00260 return false;
00261 }
00262
00263 m_ReferencePoints.clear();
00264
00265 for(NavigationDataReferenceTransformFilter::LandmarkPointContainer::const_iterator it = m_SourcePoints.begin(); it != m_SourcePoints.end(); ++it)
00266 {
00267 QuaternionTransformType::InputPointType doublePoint;
00268 mitk::itk2vtk(*it,doublePoint);
00269 TransformInitializerType::LandmarkPointType rLPoint;
00270 rLPoint = m_QuaternionReferenceTransform->TransformPoint(doublePoint);
00271 m_ReferencePoints.push_back(rLPoint);
00272 }
00273 return true;
00274 }
00275
00276
00277 void mitk::NavigationDataReferenceTransformFilter::PrintSelf( std::ostream& , itk::Indent ) const
00278 {
00279
00280 }
00281
00282 void mitk::NavigationDataReferenceTransformFilter::SetSourceLandmarks(mitk::PointSet::Pointer sourcePointSet)
00283 {
00284 m_OneSourceRegistration = false;
00285 m_ReferenceRegistration = false;
00286
00287 m_SourcePoints.clear();
00288 mitk::PointSet::PointType mitkSourcePoint;
00289 TransformInitializerType::LandmarkPointType lPoint;
00290
00291 for (mitk::PointSet::PointsContainer::ConstIterator it = sourcePointSet->GetPointSet()->GetPoints()->Begin();
00292 it != sourcePointSet->GetPointSet()->GetPoints()->End(); it++)
00293 {
00294 mitk::FillVector3D(lPoint, it->Value().GetElement(0), it->Value().GetElement(1), it->Value().GetElement(2));
00295 m_SourcePoints.push_back(lPoint);
00296 }
00297
00298 if(m_SourcePoints.size() < 1)
00299 {
00300 itkExceptionMacro("SourcePointSet must contain at least 1 point");
00301 }
00302
00303 if(this->IsInitialized())
00304 this->UpdateLandmarkTransform(m_SourcePoints, m_TargetPoints);
00305
00306 }
00307
00308
00309 void mitk::NavigationDataReferenceTransformFilter::SetTargetLandmarks(mitk::PointSet::Pointer targetPointSet)
00310 {
00311 m_OneSourceRegistration = false;
00312 m_ReferenceRegistration = false;
00313
00314
00315 m_TargetPoints.clear();
00316 TransformInitializerType::LandmarkPointType lPoint;
00317
00318
00319 for (mitk::PointSet::PointsContainer::ConstIterator it = targetPointSet->GetPointSet()->GetPoints()->Begin();
00320 it != targetPointSet->GetPointSet()->GetPoints()->End(); it++)
00321 {
00322 mitk::FillVector3D(lPoint, it->Value().GetElement(0), it->Value().GetElement(1), it->Value().GetElement(2));
00323 m_TargetPoints.push_back(lPoint);
00324 }
00325
00326 if(m_TargetPoints.size() < 1)
00327 {
00328 itkExceptionMacro("TargetPointSet must contain at least 1 point");
00329 }
00330
00331 if(this->IsInitialized())
00332 this->UpdateLandmarkTransform(m_SourcePoints, m_TargetPoints);
00333
00334 }
00335
00336
00337 bool mitk::NavigationDataReferenceTransformFilter::IsInitialized() const
00338 {
00339 return ( m_SourcePoints.size() >= 3 && (m_SourcePoints.size() == (m_TargetPoints.size())) );
00340 }
00341
00342
00343 void mitk::NavigationDataReferenceTransformFilter::UpdateLandmarkTransform(const LandmarkPointContainer &sources, const LandmarkPointContainer &targets)
00344 {
00345 try
00346 {
00347 m_LandmarkTransformInitializer->SetMovingLandmarks(targets);
00348 m_LandmarkTransformInitializer->SetFixedLandmarks(sources);
00349 m_LandmarkTransform->SetIdentity();
00350 m_LandmarkTransformInitializer->InitializeTransform();
00351
00352 this->Modified();
00353 }
00354 catch (std::exception& e)
00355 {
00356 m_LandmarkTransform->SetIdentity();
00357 itkExceptionMacro("Initializing landmark-transform failed\n. " << e.what());
00358 }
00359 }
00360
00361 void mitk::NavigationDataReferenceTransformFilter::SetReferenceInputIndexes(const std::vector<int>* indexes)
00362 {
00363 if(indexes == NULL)
00364 return;
00365
00366 m_ReferenceInputIndexes = *indexes;
00367
00368 if(m_ReferenceInputIndexes.size()<3)
00369 {
00370 m_OneSourceRegistration = true;
00371 }
00372 else
00373 {
00374 m_OneSourceRegistration = false;
00375 }
00376
00377
00378 m_SourcePoints.clear();
00379 m_TargetPoints.clear();
00380 m_ReferencePoints.clear();
00381 }
00382
00383
00384 const std::vector<int> mitk::NavigationDataReferenceTransformFilter::GetReferenceInputIndexes()
00385 {
00386 return m_ReferenceInputIndexes;
00387 }
00388
00389
00390
00391 const mitk::NavigationDataReferenceTransformFilter::LandmarkPointContainer mitk::NavigationDataReferenceTransformFilter::GetSourcePoints()
00392 {
00393 return m_SourcePoints;
00394 }
00395
00396 const mitk::NavigationDataReferenceTransformFilter::LandmarkPointContainer mitk::NavigationDataReferenceTransformFilter::GetTargetPoints()
00397 {
00398 return m_TargetPoints;
00399 }
00400
00401 const mitk::NavigationDataReferenceTransformFilter::LandmarkPointContainer mitk::NavigationDataReferenceTransformFilter::GetReferencePoints()
00402 {
00403 return m_ReferencePoints;
00404 }
00405
00406
00407
00408