[Insight-users] affine transform
annelaure
al_didier at yahoo.fr
Thu Apr 12 11:37:44 EDT 2007
Hi,
I use Iterative closest point 1 with the affine transform. I obtain 12
numbers : Solution = [0.563524, -0.0204711, -0.0675956, 0.308023, 0.539417,
-0.0100321, -0.0645276, -0.0436415, 0.554475, 83.8441, 81.0703, 139.525]. I
suppose that the 3 last numbers are the translation parameters; but I don't
know where are the rotation parameters, and the scaling parameters. Thank
you so much for your help,
best regards,
Anne-Laure
/*=========================================================================
Program: Insight Segmentation & Registration Toolkit
Module: $RCSfile: IterativeClosestPoint1.cxx,v $
Language: C++
Date: $Date: 2005/05/01 05:47:26 $
Version: $Revision: 1.5 $
Copyright (c) Insight Software Consortium. All rights reserved.
See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#ifdef _WIN32
#pragma warning ( disable : 4786 )
#endif
// Software Guide : BeginLatex
//
// This example illustrates how to perform Iterative Closest Point (ICP)
// registration in ITK. The main class featured in this section is the
// \doxygen{EuclideanDistancePointMetric}.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
#include "itkAffineTransform.h"
#include "itkEuclideanDistancePointMetric.h"
#include "itkLevenbergMarquardtOptimizer.h"
#include "itkPointSet.h"
#include "itkPointSetToPointSetRegistrationMethod.h"
#include "itkDanielssonDistanceMapImageFilter.h"
#include "itkPointSetToImageFilter.h"
#include <iostream>
#include <fstream>
int main(int argc, char * argv[] )
{
if( argc < 3 )
{
std::cerr << "Arguments Missing. " << std::endl;
std::cerr
<< "Usage: IterativeClosestPoint1 fixedPointsFile movingPointsFile
"
<< std::endl;
return 1;
}
const unsigned int Dimension = 3;
typedef itk::PointSet< float, Dimension > PointSetType;
PointSetType::Pointer fixedPointSet = PointSetType::New();
PointSetType::Pointer movingPointSet = PointSetType::New();
typedef PointSetType::PointType PointType;
typedef PointSetType::PointsContainer PointsContainer;
PointsContainer::Pointer fixedPointContainer = PointsContainer::New();
PointsContainer::Pointer movingPointContainer = PointsContainer::New();
PointType fixedPoint;
PointType movingPoint;
// Read the file containing coordinates of fixed points.
std::ifstream fixedFile;
fixedFile.open( argv[1] );
if( fixedFile.fail() )
{
std::cerr << "Error opening points file with name : " << std::endl;
std::cerr << argv[1] << std::endl;
return 2;
}
unsigned int pointId = 0;
fixedFile >> fixedPoint;
while( !fixedFile.eof() )
{
fixedPointContainer->InsertElement( pointId, fixedPoint );
fixedFile >> fixedPoint;
pointId++;
}
fixedPointSet->SetPoints( fixedPointContainer );
std::cout <<
"Number of fixed Points = " <<
fixedPointSet->GetNumberOfPoints() << std::endl;
// Read the file containing coordinates of moving points.
std::ifstream movingFile;
movingFile.open( argv[2] );
if( movingFile.fail() )
{
std::cerr << "Error opening points file with name : " << std::endl;
std::cerr << argv[2] << std::endl;
return 2;
}
pointId = 0;
movingFile >> movingPoint;
while( !movingFile.eof() )
{
movingPointContainer->InsertElement( pointId, movingPoint );
movingFile >> movingPoint;
pointId++;
}
movingPointSet->SetPoints( movingPointContainer );
std::cout << "Number of moving Points = "
<< movingPointSet->GetNumberOfPoints() << std::endl;
//-----------------------------------------------------------
// Set up the Metric
//-----------------------------------------------------------
typedef itk::EuclideanDistancePointMetric<
PointSetType,
PointSetType>
MetricType;
typedef MetricType::TransformType TransformBaseType;
typedef TransformBaseType::ParametersType ParametersType;
typedef TransformBaseType::JacobianType JacobianType;
MetricType::Pointer metric = MetricType::New();
//-----------------------------------------------------------
// Set up a Transform
//-----------------------------------------------------------
//typedef itk::TranslationTransform< double, Dimension >
TransformType;
typedef itk::AffineTransform< double,3> TransformType;
TransformType::Pointer transform = TransformType::New();
// Optimizer Type
typedef itk::LevenbergMarquardtOptimizer OptimizerType;
OptimizerType::Pointer optimizer = OptimizerType::New();
optimizer->SetUseCostFunctionGradient(false);
// Registration Method
typedef itk::PointSetToPointSetRegistrationMethod<
PointSetType,
PointSetType >
RegistrationType;
RegistrationType::Pointer registration = RegistrationType::New();
// Scale the translation components of the Transform in the Optimizer
OptimizerType::ScalesType scales( transform->GetNumberOfParameters() );
scales.Fill( 0.01 );
unsigned long numberOfIterations = 1000;
double gradientTolerance = 1e-5; // convergence criterion
double valueTolerance = 1e-5; // convergence criterion
double epsilonFunction = 1e-6; // convergence criterion
optimizer->SetScales( scales );
optimizer->SetNumberOfIterations( numberOfIterations );
optimizer->SetValueTolerance( valueTolerance );
optimizer->SetGradientTolerance( gradientTolerance );
optimizer->SetEpsilonFunction( epsilonFunction );
// Start from an Identity transform (in a normal case, the user
// can probably provide a better guess than the identity...
transform->SetIdentity();
registration->SetInitialTransformParameters( transform->GetParameters() );
//------------------------------------------------------
// Connect all the components required for Registration
//------------------------------------------------------
registration->SetMetric( metric );
registration->SetOptimizer( optimizer );
registration->SetTransform( transform );
registration->SetFixedPointSet( fixedPointSet );
registration->SetMovingPointSet( movingPointSet );
//------------------------------------------------------------
// Set up transform parameters
//------------------------------------------------------------
ParametersType parameters( transform->GetNumberOfParameters() );
// initialize the offset/vector part
parameters[0]= 1.0;
parameters[1]= 0.0;
parameters[2]= 0.0;
parameters[3]= 0.0;
parameters[4]= 1.0;
parameters[5]= 0.0;
parameters[6]= 0.0;
parameters[7]= 0.0;
parameters[8]= 1.0;
for( unsigned int k = 9; k < 12; k++ )
{
parameters[k]= 0.0;
}
transform->SetParameters(parameters);
registration->SetInitialTransformParameters( transform->GetParameters() );
try
{
registration->StartRegistration();
}
catch( itk::ExceptionObject & e )
{
std::cout << e << std::endl;
return EXIT_FAILURE;
}
metric->ComputeSquaredDistanceOn();
std::cout << "Solution = " << transform->GetParameters() << std::endl;
// Software Guide : EndCodeSnippet
return EXIT_SUCCESS;
}
--
View this message in context: http://www.nabble.com/affine-transform-tf3566168.html#a9961792
Sent from the ITK - Users mailing list archive at Nabble.com.
More information about the Insight-users
mailing list