Skip to content

Instantly share code, notes, and snippets.

@thewtex
Created January 30, 2014 16:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save thewtex/8712205 to your computer and use it in GitHub Desktop.
Save thewtex/8712205 to your computer and use it in GitHub Desktop.
Affine Transform Parameter Order
#include "itkAffineTransform.h"
#include "itkTransformFileWriter.h"
int main( int argc, char * argv[] )
{
if( argc < 2 )
{
std::cerr << "Usage: "
<< argv[0]
<< " outputTransform"
<< std::endl;
return EXIT_FAILURE;
}
const char * outputTransformFile = argv[1];
const unsigned int Dimension = 3;
typedef float ScalarType;
typedef itk::Matrix< ScalarType, Dimension + 1, Dimension + 1 > MatrixType;
MatrixType matrix4x4;
for( unsigned int ii = 0; ii < 3; ++ii )
{
for( unsigned int jj = 0; jj < 4; ++jj )
{
matrix4x4[ii][jj] = ii * 4 + jj + 1;
}
}
for( unsigned int ii = 0; ii < 3; ++ii )
{
matrix4x4[3][ii] = 0;
}
matrix4x4[3][3] = 1;
std::cout << "matrix4x4: " << matrix4x4 << std::endl;
typedef itk::Point< ScalarType, Dimension + 1 > ExtendedPointType;
ExtendedPointType extendedPoint;
extendedPoint[0] = 3.3;
extendedPoint[1] = 2.8;
extendedPoint[2] = -4.7;
extendedPoint[3] = 1.0;
std::cout << "extendedPoint: " << extendedPoint << std::endl;
const ExtendedPointType transformedExtendedPoint = matrix4x4 * extendedPoint;
std::cout << "transformedExtendedPoint: " << transformedExtendedPoint << std::endl;
typedef itk::AffineTransform< ScalarType, Dimension > TransformType;
TransformType::ParametersType parameters( Dimension * Dimension + Dimension );
for( unsigned int ii = 0; ii < 3; ++ii )
{
for( unsigned int jj = 0; jj < 3; ++jj )
{
parameters[ii * 3 + jj] = matrix4x4[ii][jj];
}
}
for( unsigned int ii = 0; ii < 3; ++ii )
{
parameters[ii + 9] = matrix4x4[ii][3];
}
std::cout << "parameters: " << parameters << std::endl;
TransformType::Pointer transform = TransformType::New();
transform->SetParameters( parameters );
std::cout << "transform: " << transform << std::endl;
typedef itk::Point< ScalarType, Dimension > PointType;
PointType point;
point[0] = extendedPoint[0];
point[1] = extendedPoint[1];
point[2] = extendedPoint[2];
const PointType transformedPoint = transform->TransformPoint( point );
std::cout << "transformedPoint: " << transformedPoint << std::endl;
typedef itk::TransformFileWriterTemplate< ScalarType > WriterType;
WriterType::Pointer writer = WriterType::New();
writer->SetInput( transform );
writer->SetFileName( outputTransformFile );
try
{
writer->Update();
}
catch( itk::ExceptionObject & err )
{
std::cerr << "Error: " << err << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
cmake_minimum_required( VERSION 2.8 )
project( AffineTransformParameterOrder )
find_package( ITK REQUIRED )
include( ${ITK_USE_FILE} )
add_executable( ${PROJECT_NAME} ${PROJECT_NAME}.cxx )
target_link_libraries( ${PROJECT_NAME} ${ITK_LIBRARIES} )
include( CTest )
add_test( NAME ${PROJECT_NAME}
COMMAND ${PROJECT_NAME} ${PROJECT_NAME}.tfm )
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment