]> Creatis software - FrontAlgorithms.git/blob - appli/examples/example_ImageAlgorithmFastMarching_01.cxx
cfa306f742f3d0aecb48bcc497cbe94fc96b6632
[FrontAlgorithms.git] / appli / examples / example_ImageAlgorithmFastMarching_01.cxx
1 #include <iostream>
2 #include <limits>
3 #include <string>
4
5 #include <itkImage.h>
6 #include <itkImageFileReader.h>
7 #include <itkImageToVTKImageFilter.h>
8
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>
19
20 #include <fpa/Image/FastMarching.h>
21 #include <fpa/VTK/Image2DObserver.h>
22
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;
29
30 typedef itk::ImageFileReader< TImage > TImageReader;
31 typedef fpa::Image::FastMarching< TImage, TScalar > TFrontAlgorithm;
32
33 typedef
34 fpa::VTK::Image2DObserver< TFrontAlgorithm, vtkRenderWindow >
35 TObserver;
36
37 // -------------------------------------------------------------------------
38 int main( int argc, char* argv[] )
39 {
40   if( argc < 2 )
41   {
42     std::cerr
43       << "Usage: " << argv[ 0 ]
44       << " input_image [stop_at_one_front]" << std::endl;
45     return( 1 );
46
47   } // fi
48   std::string input_image_fn = argv[ 1 ];
49   bool stop_at_one_front = false;
50   if( 2 < argc )
51     stop_at_one_front = ( std::atoi( argv[ 2 ] ) == 1 );
52
53   // Read image
54   TImageReader::Pointer input_image_reader = TImageReader::New( );
55   input_image_reader->SetFileName( input_image_fn );
56   try
57   {
58     input_image_reader->Update( );
59   }
60   catch( itk::ExceptionObject& err )
61   {
62     std::cerr << "Error caught: " << err << std::endl;
63     return( 1 );
64
65   } // yrt
66   TImage::ConstPointer input_image = input_image_reader->GetOutput( );
67
68   TVTKImage::Pointer vtk_image = TVTKImage::New( );
69   vtk_image->SetInput( input_image );
70   vtk_image->Update( );
71
72   // VTK visualization
73   vtkSmartPointer< vtkImageActor > actor =
74     vtkSmartPointer< vtkImageActor >::New( );
75   actor->SetInputData( vtk_image->GetOutput( ) );
76
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 );
85
86   // VTK interaction
87   vtkSmartPointer< vtkInteractorStyleImage > imageStyle =
88     vtkSmartPointer< vtkInteractorStyleImage >::New( );
89   vtkSmartPointer< vtkRenderWindowInteractor > interactor =
90     vtkSmartPointer< vtkRenderWindowInteractor >::New( );
91   interactor->SetInteractorStyle( imageStyle );
92   window->SetInteractor( interactor );
93   window->Render( );
94
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 );
102
103   vtkSmartPointer< vtkSeedWidget > widget =
104     vtkSmartPointer< vtkSeedWidget >::New( );
105   widget->SetInteractor( interactor );
106   widget->SetRepresentation( rep );
107
108   // Let some interaction
109   interactor->Initialize( );
110   window->Render( );
111   widget->On( );
112   interactor->Start( );
113
114   // Configure observer
115   TObserver::Pointer obs = TObserver::New( );
116   obs->SetImage( input_image, window );
117
118   // Configure algorithm
119   TFrontAlgorithm::Pointer algorithm = TFrontAlgorithm::New( );
120   for( unsigned int s = 0; s < rep->GetNumberOfSeeds( ); s++ )
121   {
122     double pos[ 3 ];
123     rep->GetSeedWorldPosition( s, pos );
124
125     TImage::PointType pnt;
126     pnt[ 0 ] = pos[ 0 ];
127     pnt[ 1 ] = pos[ 1 ];
128
129     TImage::IndexType idx;
130     if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
131     {
132       algorithm->AddSeed( idx, 0 );
133       std::cout << " Seed --> " << idx << std::endl;
134
135     } // fi
136
137   } // rof
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( );
144
145   // One last interaction
146   window->Render( );
147   interactor->Start( );
148
149   return( 0 );
150 }
151
152 // eof - $RCSfile$