[Insight-users] Demons observer

Luis Ibanez luis.ibanez at kitware.com
Fri Jun 11 01:10:46 EDT 2004


Hi Josiane,

The Demons registration method shown in the example
DeformableRegistration2.cxx uses a Sum of Squared
Differences Metric. This metric is inherit to the
method and cannot be easily changes as you are probably
used to with the methods in the ITK registration framework.

You may find useful to look at the papers by J-P. Thirion
describing this method.

Note that if you want to do deformable registration using
alternative metrics, you may consider using the BSPlineTransorm
as illustrated in

          DeformableRegistration4.cxx


or the FEM deformable registration method as described in


          DeformableRegistration1.cxx


Please let us know if you have further questions,



   Thanks


      Luis



----------------------------------------------------
Josiane Yankam Njiwa--DEA Clarysse--Fin 11/04 wrote:

> Hi Luis,
> 
> Thank you for your help, I have resolve my problem. Please, I have another
> question,  in DeformableRegistration2.cxx there is anywhere the definition
> of the type of the metric which is use.
> Thanks a lot.
> 
> Josiane.
> 
> 
> 
> 
> 
> 
> 
> 
> 
>>Hi Josiane,
>>
>>Command/Observers have two Execute methods, they differ
>>on the constness of the (Object *) received as argument.
>>
>>Since you are attempting to do dynamic casting on the
>>Execute() method that receives a const pointer to Object,
>>then you must respect the constness in the dynamic_cast.
>>
>>
>>Please try the following line:
>>
>>
>>  const RegistrationFilterType * filter=
>>     dynamic_cast< const RegistrationFilterType * >( object );
>>                   ^^^^^
>>
>>You may want to see the identical code in the example:
>>
>>   Insight/Examples/Registration/
>>             DeformableRegistration2.cxx
>>
>>
>>in lines 73 and 74.
>>
>>
>>
>>Let us know if you still find any problem.
>>
>>
>>   Thanks
>>
>>
>>     Luis
>>
>>
>>-------------------------------------------------------
>>Josiane Yankam Njiwa--DEA Clarysse--Fin 11/04 wrote:
>>
>>
>>>Hi Luis
>>>
>>>
>>>Thanks for your answer. When I replace RegistrationFilterType::Pointer
>>>filter=dynamic_cast< RegistrationFilterType>( object );
>>>by
>>>const RegistrationFilterType * filter=dynamic_cast<
>>>RegistrationFilterType
>>>* >( object );
>>>I hae another message error, I don't know how to solve it. Th emessage
>>>is:
>>>cannot use dynamic_cast to convert from 'const class itk::Object *' to
>>>'class itk::DemonsRegistrationFilter<class itk::Image<float,2>,class
>>>itk::Image<float,2>,class itk::Image<class itk:
>>>:Vector<float,2>,2> > *'
>>>
>>>Can you help me?
>>>
>>>Regards.
>>>
>>>Josiane.
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>>Hi Josiane,
>>>>
>>>>
>>>>As Lydia replied to you on June 4th:
>>>>http://www.itk.org/pipermail/insight-users/2004-June/008789.html
>>>>
>>>>You must modify the line
>>>>
>>>>
>>>>>   dynamic_cast< RegistrationFilterType>( object );
>>>>
>>>>and put
>>>>
>>>>
>>>>>   dynamic_cast< RegistrationFilterType * >( object );
>>>>
>>>>
>>>>Dynamic casting requires pointers or references to types.
>>>>It cannot be done on direct types.
>>>>
>>>>
>>>>   Regards,
>>>>
>>>>
>>>>      Luis
>>>>
>>>>
>>>>------------------------------------------------------
>>>>Josiane Yankam Njiwa--DEA Clarysse--Fin 11/04 wrote:
>>>>
>>>>
>>>>
>>>>>Hi,
>>>>>
>>>>>I want to see how the demons registration compute the displacement at
>>>>>each
>>>>>iteration and i like to add to the program an obsever, but i have this
>>>>>message error during the compilation:error C2680: 'class
>>>>>itk::DemonsRegistrationFilter<class itk::Image<float,2>,class
>>>>>itk::Image<float,2>,class itk::Image<class itk::Vector<float,2>,2> >' :
>>>>>invalid target type for dynamic_cast
>>>>>Error executing cl.exe.
>>>>>
>>>>>I don't how to overpass my problem. Thanks for your help.
>>>>>
>>>>>Regards
>>>>>
>>>>>Josiane
>>>>>
>>>>>
>>>>>Here is my code:
>>>>>
>>>>>
>>>>>
>>>>>#include "itkCommand.h"
>>>>>class CommandIterationUpdate : public itk::Command
>>>>>{
>>>>>public:
>>>>> typedef  CommandIterationUpdate   Self;
>>>>> typedef  itk::Command             Superclass;
>>>>> typedef itk::SmartPointer<Self>  Pointer;
>>>>> itkNewMacro( Self );
>>>>>protected:
>>>>> CommandIterationUpdate() {};
>>>>>public:
>>>>>
>>>>> typedef float InternalPixelType;
>>>>> typedef itk::Image< InternalPixelType, 2 > InternalImageType;
>>>>> typedef itk::Vector< float, 2 >    VectorPixelType;
>>>>> typedef itk::Image<  VectorPixelType, 2 > DeformationFieldType;
>>>>> typedef itk::DemonsRegistrationFilter<
>>>>>                               InternalImageType,
>>>>>                               InternalImageType,
>>>>>                               DeformationFieldType>
>>>>>RegistrationFilterType;
>>>>>
>>>>>
>>>>>
>>>>> void Execute(itk::Object *caller, const itk::EventObject & event)
>>>>>   {
>>>>>     Execute( (const itk::Object *)caller, event);
>>>>>   }
>>>>>
>>>>> void Execute(const itk::Object * object, const itk::EventObject &
>>>>>event)
>>>>>   {
>>>>>
>>>>>         RegistrationFilterType::Pointer filter=
>>>>>                 dynamic_cast< RegistrationFilterType>( object );
>>>>>
>>>>>     if( typeid( event ) != typeid( itk::IterationEvent ) )
>>>>>       {
>>>>>       return;
>>>>>       }
>>>>>     std::cout << filter->GetElapsedIterations()<< "   ";
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>_______________________________________________
>>>>>Insight-users mailing list
>>>>>Insight-users at itk.org
>>>>>http://www.itk.org/mailman/listinfo/insight-users
>>>>>
>>>>
>>>>
>>>>
>>>
>>
>>
> 
> 





More information about the Insight-users mailing list