VTK/Examples/Cxx/PolyData/ThinPlateSplineTransform
From KitwarePublic
Jump to navigationJump to searchContents
ThinPlateSplineTransform.cxx
#include "vtkImageGridSource.h"
#include "vtkLookupTable.h"
#include "vtkImageMapToColors.h"
#include "vtkBMPReader.h"
#include "vtkImageBlend.h"
#include "vtkPoints.h"
#include "vtkThinPlateSplineTransform.h"
#include "vtkImageReslice.h"
#include "vtkSmartPointer.h"
#include "vtkDataObject.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkInteractorStyleTerrain.h"
#include "vtkImageMapper.h"
#include "vtkActor2D.h"
// Warp an image with a thin plate spline
int main(int argc, char *argv[])
{
if ( argc < 2 )
{
std::cerr << "Usage: " << argv[0] << " Filename.bmp" << std::endl;
return EXIT_FAILURE;
}
// First, create an image to warp
vtkSmartPointer<vtkImageGridSource> imageGrid =
vtkSmartPointer<vtkImageGridSource >::New();
imageGrid->SetGridSpacing( 16, 16, 0 );
imageGrid->SetGridOrigin( 0, 0, 0 );
imageGrid->SetDataExtent( 0, 255, 0, 255, 0, 0 );
imageGrid->SetDataScalarTypeToUnsignedChar();
vtkSmartPointer<vtkLookupTable> table =
vtkSmartPointer<vtkLookupTable >::New();
table->SetTableRange( 0, 1 );
table->SetAlphaRange( 0.0, 1.0 );
table->SetHueRange( 0.15, 0.15 );
table->SetSaturationRange( 1, 1 );
table->SetValueRange( 0, 1 );
table->Build();
vtkSmartPointer<vtkImageMapToColors> alpha =
vtkSmartPointer<vtkImageMapToColors >::New();
alpha->SetInputConnection( imageGrid->GetOutputPort() );
alpha->SetLookupTable( table );
vtkSmartPointer<vtkBMPReader> reader =
vtkSmartPointer<vtkBMPReader>::New();
reader->SetFileName(argv[1]);
reader->Update();
vtkSmartPointer<vtkImageBlend> blend =
vtkSmartPointer<vtkImageBlend >::New();
blend->AddInputConnection( 0, reader->GetOutputPort() );
blend->AddInputConnection( 0, alpha->GetOutputPort() );
// Next, create a ThinPlateSpline transform
vtkSmartPointer< vtkPoints > p1 = vtkSmartPointer< vtkPoints >::New();
p1->SetNumberOfPoints( 8 );
p1->SetPoint( 0, 0, 0, 0 );
p1->SetPoint( 1, 0, 255, 0);
p1->SetPoint( 2, 255, 0, 0 );
p1->SetPoint( 3, 255, 255, 0 );
p1->SetPoint( 4, 96, 96, 0 );
p1->SetPoint( 5, 96, 159, 0 );
p1->SetPoint( 6, 159, 159, 0 );
p1->SetPoint( 7, 159, 96, 0 );
vtkSmartPointer< vtkPoints > p2 = vtkSmartPointer< vtkPoints >::New();
p2->SetNumberOfPoints( 8 );
p2->SetPoint( 0, 0, 0, 0 );
p2->SetPoint( 1, 0, 255, 0 );
p2->SetPoint( 2, 255, 0, 0 );
p2->SetPoint( 3, 255, 255, 0);
p2->SetPoint( 4, 96, 159, 0 );
p2->SetPoint( 5, 159, 159, 0 );
p2->SetPoint( 6, 159, 96, 0 );
p2->SetPoint( 7, 96, 96, 0 );
vtkSmartPointer<vtkThinPlateSplineTransform> transform =
vtkSmartPointer< vtkThinPlateSplineTransform >::New();
transform->SetSourceLandmarks( p2 );
transform->SetTargetLandmarks( p1 );
transform->SetBasisToR2LogR();
// You must invert the transform before passing it to vtkImageReslice
transform->Inverse();
vtkSmartPointer< vtkImageReslice > reslice =
vtkSmartPointer<vtkImageReslice >::New();
reslice->SetInputConnection( blend->GetOutputPort() );
reslice->SetResliceTransform( transform );
reslice->SetInterpolationModeToLinear();
vtkSmartPointer< vtkImageMapper > map =
vtkSmartPointer<vtkImageMapper >::New();
map->SetInputConnection( reslice->GetOutputPort() );
map->SetColorWindow( 255.0);
map->SetColorLevel( 127.5 );
map->SetZSlice( 0 );
vtkSmartPointer< vtkActor2D > act =
vtkSmartPointer< vtkActor2D >::New();
act->SetMapper( map );
act->SetPosition( 0.0, 0.0 );
vtkSmartPointer< vtkRenderer > renderer =
vtkSmartPointer<vtkRenderer >::New();
renderer->AddActor( act );
vtkSmartPointer< vtkRenderWindow > window =
vtkSmartPointer<vtkRenderWindow >::New();
window->SetSize( 640, 480 );
window->AddRenderer(renderer);
vtkSmartPointer< vtkRenderWindowInteractor > interactor =
vtkSmartPointer< vtkRenderWindowInteractor >::New();
interactor->SetRenderWindow(window);
vtkSmartPointer< vtkInteractorStyleTerrain > style =
vtkSmartPointer< vtkInteractorStyleTerrain >::New();
interactor->SetInteractorStyle( style );
interactor->Initialize();
interactor->Start();
return EXIT_SUCCESS;
}
Please try the new VTKExamples website.
CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
PROJECT(ThinPlateSplineTransform)
find_package(VTK REQUIRED)
include(${VTK_USE_FILE})
add_executable(ThinPlateSplineTransform MACOSX_BUNDLE ThinPlateSplineTransform.cxx)
if(VTK_LIBRARIES)
target_link_libraries(ThinPlateSplineTransform ${VTK_LIBRARIES})
else()
target_link_libraries(ThinPlateSplineTransform vtkHybrid vtkWidgets)
endif()
Download and Build ThinPlateSplineTransform
Click here to download ThinPlateSplineTransform. and its CMakeLists.txt file.
Once the tarball ThinPlateSplineTransform.tar has been downloaded and extracted,
cd ThinPlateSplineTransform/build
- If VTK is installed:
cmake ..
- If VTK is not installed but compiled on your system, you will need to specify the path to your VTK build:
cmake -DVTK_DIR:PATH=/home/me/vtk_build ..
Build the project:
make
and run it:
./ThinPlateSplineTransform
WINDOWS USERS PLEASE NOTE: Be sure to add the VTK bin directory to your path. This will resolve the VTK dll's at run time.