[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