6 #include <itkImageFileReader.h>
7 #include <itkImageToVTKImageFilter.h>
9 #include <vtkImageActor.h>
10 #include <vtkInteractorStyleImage.h>
11 #include <vtkPointHandleRepresentation3D.h>
12 #include <vtkProperty.h>
13 #include <vtkRenderer.h>
14 #include <vtkRenderWindow.h>
15 #include <vtkRenderWindowInteractor.h>
16 #include <vtkSeedRepresentation.h>
17 #include <vtkSeedWidget.h>
18 #include <vtkSmartPointer.h>
20 #include <fpa/Image/FastMarching.h>
21 #include <fpa/VTK/Image2DObserver.h>
23 // -------------------------------------------------------------------------
24 const unsigned int Dim = 2;
25 typedef unsigned char TPixel;
26 typedef double TScalar;
27 typedef itk::Image< TPixel, Dim > TImage;
28 typedef itk::ImageToVTKImageFilter< TImage > TVTKImage;
30 typedef itk::ImageFileReader< TImage > TImageReader;
31 typedef fpa::Image::FastMarching< TImage, TScalar > TFrontAlgorithm;
34 fpa::VTK::Image2DObserver< TFrontAlgorithm, vtkRenderWindow >
37 // -------------------------------------------------------------------------
38 int main( int argc, char* argv[] )
43 << "Usage: " << argv[ 0 ]
44 << " input_image [stop_at_one_front]" << std::endl;
48 std::string input_image_fn = argv[ 1 ];
49 bool stop_at_one_front = false;
51 stop_at_one_front = ( std::atoi( argv[ 2 ] ) == 1 );
54 TImageReader::Pointer input_image_reader = TImageReader::New( );
55 input_image_reader->SetFileName( input_image_fn );
58 input_image_reader->Update( );
60 catch( itk::ExceptionObject& err )
62 std::cerr << "Error caught: " << err << std::endl;
66 TImage::ConstPointer input_image = input_image_reader->GetOutput( );
68 TVTKImage::Pointer vtk_image = TVTKImage::New( );
69 vtk_image->SetInput( input_image );
73 vtkSmartPointer< vtkImageActor > actor =
74 vtkSmartPointer< vtkImageActor >::New( );
75 actor->SetInputData( vtk_image->GetOutput( ) );
77 vtkSmartPointer< vtkRenderer > renderer =
78 vtkSmartPointer< vtkRenderer >::New( );
79 renderer->SetBackground( 0.1, 0.2, 0.7 );
80 renderer->AddActor( actor );
81 vtkSmartPointer< vtkRenderWindow > window =
82 vtkSmartPointer< vtkRenderWindow >::New( );
83 window->SetSize( 800, 800 );
84 window->AddRenderer( renderer );
87 vtkSmartPointer< vtkInteractorStyleImage > imageStyle =
88 vtkSmartPointer< vtkInteractorStyleImage >::New( );
89 vtkSmartPointer< vtkRenderWindowInteractor > interactor =
90 vtkSmartPointer< vtkRenderWindowInteractor >::New( );
91 interactor->SetInteractorStyle( imageStyle );
92 window->SetInteractor( interactor );
95 // Create the widget and its representation
96 vtkSmartPointer< vtkPointHandleRepresentation3D > handle =
97 vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
98 handle->GetProperty( )->SetColor( 1, 0, 0 );
99 vtkSmartPointer< vtkSeedRepresentation > rep =
100 vtkSmartPointer< vtkSeedRepresentation >::New( );
101 rep->SetHandleRepresentation( handle );
103 vtkSmartPointer< vtkSeedWidget > widget =
104 vtkSmartPointer< vtkSeedWidget >::New( );
105 widget->SetInteractor( interactor );
106 widget->SetRepresentation( rep );
108 // Let some interaction
109 interactor->Initialize( );
112 interactor->Start( );
114 // Configure observer
115 TObserver::Pointer obs = TObserver::New( );
116 obs->SetImage( input_image, window );
118 // Configure algorithm
119 TFrontAlgorithm::Pointer algorithm = TFrontAlgorithm::New( );
120 for( unsigned int s = 0; s < rep->GetNumberOfSeeds( ); s++ )
123 rep->GetSeedWorldPosition( s, pos );
125 TImage::PointType pnt;
129 TImage::IndexType idx;
130 if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
132 algorithm->AddSeed( idx, 0 );
133 std::cout << " Seed --> " << idx << std::endl;
138 algorithm->AddObserver( itk::AnyEvent( ), obs );
139 algorithm->ThrowEventsOn( );
140 algorithm->SetInput( input_image );
141 algorithm->SetNeighborhoodOrder( 1 );
142 algorithm->SetStopAtOneFront( stop_at_one_front );
143 algorithm->Update( );
145 // One last interaction
147 interactor->Start( );