[IGSTK-Users] Problem on landmark registration reuse

Patrick Cheng cheng at isis.georgetown.edu
Mon Jan 22 11:56:37 EST 2007


Hi Fucang,

I found the cause of this issue.

Around line 337 in igstkLandmark3DRegistration class,
  m_TransformInitializer->SetFixedLandmarks(m_TrackerLandmarks);
  m_TransformInitializer->SetMovingLandmarks(m_ImageLandmarks);
  m_TransformInitializer->SetTransform( m_Transform );

If I change this into:
  m_TransformInitializer->SetFixedLandmarks(m_TrackerLandmarks);
  m_TransformInitializer->SetMovingLandmarks(m_ImageLandmarks);
  m_Transform = NULL;
  m_Transform = TransformType::New();
  m_TransformInitializer->SetTransform( m_Transform );

Your code will give a consistent result.

The igstkLandmark3DRegistration uses
itkLandmarkBaseTransformInitializer.txx inside. I thought
  m_TransformInitializer->SetTransform( m_Transform );
is just passing a pointer to store the resulting transform.
But in the itkLandmarkBaseTransformInitializer.txx class line 123.
  RotationCenterType rotationCenter = transform->GetCenter();
So it's using the center of the transform as the rotation center. I
don't quite understand this algorithm.

So when you reuse the igstkLandmark3DRegistration, because m_Transform
in this class, stores the results from last registration, so you are
passing a different m_Transform to the m_TransformInitializer, that's
why it's giving a different results.

I still don't quite understand why it's behaving like that. Maybe ITK
guru can answer this question?

Thank you,
Patrick




jiafucang at 126.com wrote:
>  
> Hi,
>  
> I encoutered a strange problem. I need to reuse landmark registration 
> for several times.
> In FourViewsTrackingWithCT application, I see that when the second set 
> of image and tracker
> landmarks were set, the landmark registration could not give the correct 
> result.
>  
> Here is an example, could anyone find anything wrong in the following code?
>  
>  
> #if defined(_MSC_VER)
> #pragma warning( disable : 4786 )
> #endif
> #include <iostream>
> #include "igstkLandmark3DRegistration.h"
> #include "igstkLandmark3DRegistrationErrorEstimator.h"
> #include "itkLogger.h"
> #include "itkStdStreamLogOutput.h"
> #include "itkObject.h"
> #include "itkCommand.h"
> #include "itkMacro.h"
> #include "igstkEvents.h"
> #include "igstkTransform.h"
>  
> class Landmark3DRegistrationGetTransformCallback: public itk::Command
> {
> public:
>  typedef Landmark3DRegistrationGetTransformCallback    Self;
>  typedef itk::SmartPointer<Self>                       Pointer;
>  typedef itk::Command                                  Superclass;
>  itkNewMacro(Self);
>  
>  typedef igstk::TransformModifiedEvent TransformModifiedEventType;
>  
>  void Execute( const itk::Object *caller, const itk::EventObject & event )
>     {
>     }
>  
>  void Execute( itk::Object *caller, const itk::EventObject & event )
>     {
>   std::cout<< " TransformEvent is thrown" << std::endl;
>   const TransformModifiedEventType * transformEvent =
>    dynamic_cast < const TransformModifiedEventType* > ( &event );
>   m_Transform = transformEvent->Get();
>   m_EventReceived = true;
>     }
>  bool GetEventReceived()
>     {
>   return m_EventReceived;
>     }
>  igstk::Transform GetTransform()
>     {
>   return m_Transform;
>     } 
> protected:
>  
>  Landmark3DRegistrationGetTransformCallback()  
>     {
>   m_EventReceived = true;
>     }
>  
> private:
>  bool m_EventReceived;
>  igstk::Transform m_Transform;
> };
> int main( int argv, char * argc[] )
> {
>  
>  
>  
>  igstk::RealTimeClock::Initialize();
>  
>  
>  typedef itk::Logger                   LoggerType;
>  typedef itk::StdStreamLogOutput       LogOutputType;
>    
>  typedef igstk::Landmark3DRegistration
>   Landmark3DRegistrationType;
>  typedef igstk::Landmark3DRegistration::LandmarkPointContainerType
>   LandmarkPointContainerType;
>  typedef igstk::Landmark3DRegistration::LandmarkImagePointType
>   LandmarkImagePointType;
>  typedef igstk::Landmark3DRegistration::LandmarkTrackerPointType
>   LandmarkTrackerPointType;
>  typedef Landmark3DRegistrationType::TransformType::OutputVectorType
>   OutputVectorType;
>  typedef igstk::Transform  TransformType;
>  
>  
>  
>  Landmark3DRegistrationType::Pointer landmarkRegister =
>   Landmark3DRegistrationType::New();
>  
>  LandmarkImagePointType      imagePoint;
>  LandmarkTrackerPointType    trackerPoint;
>  
>  
>  
>  typedef itk::VersorRigid3DTransform<double>        
> VersorRigid3DTransformType;
>  typedef VersorRigid3DTransformType::ParametersType ParametersType;
>  
>  TransformType      transform;
>  ParametersType     parameters(6);
>  
>  
>  Landmark3DRegistrationGetTransformCallback::Pointer lrtcb =
>   Landmark3DRegistrationGetTransformCallback::New();
>  landmarkRegister->AddObserver( igstk::TransformModifiedEvent(), lrtcb );
>  
>  typedef igstk::Landmark3DRegistrationErrorEstimator   ErrorEstimatorType;
>  
>  typedef ErrorEstimatorType::TargetPointType   TargetPointType;
>  typedef ErrorEstimatorType::ErrorType         ErrorType;
>  
>  ErrorType                   landmarkRegistrationError;
>  
>  // test landmark registration reuse
>  if(1)
>  {
>   imagePoint[0] =  78.3163;
>   imagePoint[1] =  15.3252;
>   imagePoint[2] =  16;
>   landmarkRegister->RequestAddImageLandmarkPoint(imagePoint);
>   
>   trackerPoint[0] =  199.274;
>   trackerPoint[1] =  -26.6466;
>   trackerPoint[2] =  -869.895;
>   landmarkRegister->RequestAddTrackerLandmarkPoint(trackerPoint);
>   
>   imagePoint[0] =  12.5937;
>   imagePoint[1] =   9.9381;
>   imagePoint[2] =  16;
>   landmarkRegister->RequestAddImageLandmarkPoint(imagePoint);
>   
>   trackerPoint[0] =  218.485;
>   trackerPoint[1] =  -2.90349;
>   trackerPoint[2] =  -882.859;
>   landmarkRegister->RequestAddTrackerLandmarkPoint(trackerPoint);
>   
>   
>   imagePoint[0] =  45.3473;
>   imagePoint[1] =   7.78325;
>   imagePoint[2] =  60;
>   landmarkRegister->RequestAddImageLandmarkPoint(imagePoint);
>   
>   trackerPoint[0] =  304.046;
>   trackerPoint[1] =  -34.6625;
>   trackerPoint[2] =  -885.358;
>   landmarkRegister->RequestAddTrackerLandmarkPoint(trackerPoint);
>   
>   landmarkRegister->RequestComputeTransform();
>   
>   landmarkRegister->RequestGetTransform();
>   
>   transform = lrtcb->GetTransform();
>   std::cout << "Transform " << transform << std::cout;
>   
>   landmarkRegistrationError = landmarkRegister->ComputeRMSError();
>   std::cout<<"RMS Error is "<<landmarkRegistrationError<<std::endl;
>  }
>  
>  
>  // reuse landmark registration
>  landmarkRegister->RequestResetRegistration();
>  
>  imagePoint[0] =  77.2389;
>  imagePoint[1] =  15.9716;
>  imagePoint[2] =  16;
>  landmarkRegister->RequestAddImageLandmarkPoint(imagePoint);
>  trackerPoint[0] =  230.525;
>  trackerPoint[1] =  -44.7263;
>  trackerPoint[2] =  -894.183;
>  landmarkRegister->RequestAddTrackerLandmarkPoint(trackerPoint);
>  
>  // Add 2nd landmark
>  imagePoint[0] =  14.1021;
>  imagePoint[1] =  10.3691;
>  imagePoint[2] =  16;
>  landmarkRegister->RequestAddImageLandmarkPoint(imagePoint);
>  trackerPoint[0] =  211.976;
>  trackerPoint[1] =  -41.8738;
>  trackerPoint[2] =  -875.216;
>  landmarkRegister->RequestAddTrackerLandmarkPoint(trackerPoint);
>  
>  // Add 3d landmark
>  imagePoint[0] =  45.9937;
>  imagePoint[1] =  6.27483;
>  imagePoint[2] =  68;
>  landmarkRegister->RequestAddImageLandmarkPoint(imagePoint);
>  trackerPoint[0] =  303.781;
>  trackerPoint[1] =  -35.4769;
>  trackerPoint[2] =  -887.587;
>  landmarkRegister->RequestAddTrackerLandmarkPoint(trackerPoint);
>  
>  landmarkRegister->RequestComputeTransform();
>  landmarkRegister->RequestGetTransform();
>  
>  transform = lrtcb->GetTransform();
>  std::cout << "Transform " << transform << std::cout;
>  
>  landmarkRegistrationError = landmarkRegister->ComputeRMSError();
>  std::cout<<"RMS Error is "<<landmarkRegistrationError<<std::endl;
>  
>  return 0;
> }
>  
>  
> Thank you very much!
>  
> Best,
> Fucang
>  
>  
> 
> 
> ------------------------------------------------------------------------
> 独家!网易3G免费邮,还赠送280兆网盘 www.126.com <http://www.126.com/>
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> IGSTK-Users mailing list
> IGSTK-Users at public.kitware.com
> http://public.kitware.com/cgi-bin/mailman/listinfo/igstk-users



More information about the IGSTK-Users mailing list