[Insight-users] link error GradientDescentOptimizer

Yannick Pannier pannier at lms.polytechnique.fr
Wed Jun 27 12:32:07 EDT 2007


Hi everybody,

I'm trying to use ITK with my application to compute affine 
transformation parameters from 2 CT images.
I 've imported 2 3D images from my application and then try to 
registrate them witk ITK, I 've choosen these parameters for the 
registration :
affinetransform, bsplineinterpolator,gradientdescentoptimizer and 
NormalizedCorrelationImageToImageMetric.

Compilation of objects with g++ is ok, but there is an error during the 
link operation.
Here is the message :
essai_ITK_lib.o: In function 
`itk::ObjectFactory<itk::GradientDescentOptimizer>::Create()':
/home/pannier/src/Insight/Code/Common/itkObjectFactory.h:52: undefined 
reference to `typeinfo for itk::GradientDescentOptimizer'
/home/pannier/src/Insight/Code/Common/itkObjectFactory.h:53: undefined 
reference to `typeinfo for itk::GradientDescentOptimizer'
essai_ITK_lib.o: In function `CostFunction':
/home/pannier/src/Insight/Code/Numerics/itkCostFunction.h:61: undefined 
reference to `vtable for itk::CostFunction'
essai_ITK_lib.o: In function `~CostFunction':
/home/pannier/src/Insight/Code/Numerics/itkCostFunction.h:62: undefined 
reference to `vtable for itk::CostFunction'
essai_ITK_lib.o: In function 
`itk::ImageToImageMetric<itk::Image<unsigned char, 3u>, 
itk::Image<unsigned char, 3u> >::PrintSelf(std::basic_ostream<char, 
std::char_traits<char> >&, itk::Indent) const':
/home/pannier/src/Insight/Code/Algorithms/itkImageToImageMetric.txx:168: 
undefined reference to 
`itk::CostFunction::PrintSelf(std::basic_ostream<char, 
std::char_traits<char> >&, itk::Indent) const'
essai_ITK_lib.o: In function `itk::GradientDescentOptimizer::New()':
/home/pannier/src/Insight/Code/Numerics/itkGradientDescentOptimizer.h:59: 
undefined reference to 
`itk::GradientDescentOptimizer::GradientDescentOptimizer()'
essai_ITK_lib.o:(.gnu.linkonce.r._ZTIN3itk24SingleValuedCostFunctionE+0x8): 
undefined reference to `typeinfo for itk::CostFunction'
essai_ITK_lib.o:(.gnu.linkonce.r._ZTVN3itk24SingleValuedCostFunctionE+0x2c): 
undefined reference to 
`itk::CostFunction::PrintSelf(std::basic_ostream<char, 
std::char_traits<char> >&, itk::Indent) const'
collect2: ld a retourné 1 code d'état d'exécution

Here is my code (essai_ITK_lib.cpp) :
extern "C"
    {
    VFloat ITK_registrate(VImage ini_ima, VImage ima, VLong coresizex, 
VLong coresizey, VLong coresizez, double xini, double yini, double zini, 
double xgro, double ygro, double zgro, double * x, double * y, double * z)
    {
    typedef unsigned char   PixelType;
    const unsigned int Dimension = 3;
    typedef itk::Image< PixelType, Dimension > ImageType;
    typedef itk::ImportImageFilter< PixelType, Dimension >   
ImportFilterType;
    ImportFilterType::Pointer importFilterIni = 
ImportFilterType::New();     
    ImportFilterType::Pointer importFilterDefo = 
ImportFilterType::New();     
    ImportFilterType::SizeType  size;
    size[0]  = coresizex;  // size along X
    size[1]  = coresizey;  // size along Y
    size[2]  = coresizez;  // size along Z
    const unsigned int numberOfPixels =  size[0] * size[1] * size[2];
    PixelType * image0;
    PixelType * image1;
    image0 = & VPixel(ini_ima, 0, 0, 0,PixelType);
    image1 = & VPixel(ima, 0, 0, 0,PixelType);
    ImportFilterType::IndexType start;
    start.Fill( 0 );
    ImportFilterType::RegionType region;
    region.SetIndex( start );
    region.SetSize(  size  );
    importFilterIni->SetRegion( region );
    importFilterDefo->SetRegion( region );
    double origin[ Dimension ];
    origin[0] = 0.0;    // X coordinate
    origin[1] = 0.0;    // Y coordinate
    origin[2] = 0.0;    // Z coordinate
    importFilterIni->SetOrigin( origin );
    importFilterDefo->SetOrigin( origin );
    double spacing[ Dimension ];
    spacing[0] = 1.0;    // along X direction
    spacing[1] = 1.0;    // along Y direction
    spacing[2] = 1.0;    // along Z direction
    importFilterIni->SetSpacing( spacing );
    importFilterDefo->SetSpacing( spacing );
    printf("coucou 94");
    const bool importImageFilterWillOwnTheBuffer = false;
    importFilterIni->SetImportPointer( image0, numberOfPixels,
                                  importImageFilterWillOwnTheBuffer );
    importFilterDefo->SetImportPointer( image1, numberOfPixels,
                                  importImageFilterWillOwnTheBuffer );
    typedef itk::AffineTransform<double, Dimension> TransformType;
    typedef itk::GradientDescentOptimizer             OptimizerType;
    typedef itk::NormalizedCorrelationImageToImageMetric< ImageType, 
ImageType > MetricType;
    typedef itk::ImageRegistrationMethod<ImageType,ImageType> 
RegistrationType;
    typedef itk::BSplineInterpolateImageFunction<ImageType,double> 
InterpolatorType;   
    MetricType::Pointer            metric         = MetricType::New();
    TransformType::Pointer      transform     = TransformType::New();
    OptimizerType::Pointer      optimizer     = OptimizerType::New();
    InterpolatorType::Pointer   interpolator  = InterpolatorType::New();
    RegistrationType::Pointer   registration  = RegistrationType::New();
    registration->SetMetric(        metric        );
    registration->SetOptimizer(     optimizer     );
    registration->SetTransform(     transform     );
    registration->SetInterpolator(  interpolator  );
    registration->SetFixedImage(    importFilterIni->GetOutput()    );
    registration->SetMovingImage(    importFilterDefo->GetOutput()    );
    interpolator->SetSplineOrder(3);
    
registration->SetFixedImageRegion(importFilterIni->GetOutput()->GetBufferedRegion());
    typedef RegistrationType::ParametersType ParametersType;
    ParametersType initialParameters( 
transform->GetNumberOfParameters()    );
    initialParameters.Fill( 0.0 );
    initialParameters[0] = 1.0;
    initialParameters[4] = 1.0;
    initialParameters[8] = 1.0;
    registration->SetInitialTransformParameters(initialParameters);
    optimizer->SetLearningRate( 15.0 );
    optimizer->SetNumberOfIterations( 100 );
    try
    {
        registration->Update();
    }
    catch( itk::ExceptionObject & err )
    {
        std::cerr << "ExceptionObject Caught !" << std::endl;
        std::cerr << err << std::endl;
        return -1;
    }
   
    ParametersType finalParameters = 
registration->GetLastTransformParameters();
    std::cout << " parameters :" << finalParameters[0] << 
finalParameters[1] << finalParameters[2] << finalParameters[3] << 
finalParameters[4] << finalParameters[5]<< std::endl;
    std::cout << finalParameters[6] << finalParameters[7] << 
finalParameters[8] << finalParameters[9] << finalParameters[10] << 
finalParameters[11] << std::endl;
    const unsigned int numberOfIterations = 
optimizer->GetCurrentIteration();
    std::cout<<"number of iterations"<<numberOfIterations<<std::endl;
   
    return(0);
    }

}

Could anybody help me ?

Thanks,

Yannick


More information about the Insight-users mailing list