]> Creatis software - FrontAlgorithms.git/blobdiff - appli/examples/example_Image_RegionGrow_AllRGBPixels.cxx
CMake updated. Some other filters added.
[FrontAlgorithms.git] / appli / examples / example_Image_RegionGrow_AllRGBPixels.cxx
index fdb90fa1317f962905964945af01f3ea0e44f86d..c46c75824fafc616bd459a3453da318aba55b541 100644 (file)
@@ -4,34 +4,20 @@
 #include <string>
 
 #include <itkImage.h>
-#include <itkImageToVTKImageFilter.h>
 #include <itkRGBPixel.h>
-
-#include <itkImageFileReader.h>
-
-#include <vtkCamera.h>
-#include <vtkImageActor.h>
-#include <vtkInteractorStyleImage.h>
-#include <vtkPointHandleRepresentation3D.h>
-#include <vtkProperty.h>
-#include <vtkRenderer.h>
-#include <vtkRenderWindow.h>
-#include <vtkRenderWindowInteractor.h>
-#include <vtkSeedRepresentation.h>
-#include <vtkSeedWidget.h>
-#include <vtkSmartPointer.h>
+#include <itkImageToVTKImageFilter.h>
 
 #include <fpa/Image/RegionGrow.h>
-#include <fpa/Base/Functors/TautologyFunction.h>
+#include <fpa/Image/Functors/RegionGrowAllBelongsFunction.h>
 #include <fpa/VTK/Image2DObserver.h>
 
+#include "fpa_Utility.h"
+
 // -------------------------------------------------------------------------
 const unsigned int Dim = 2;
 typedef unsigned char TPixel;
-
 typedef itk::Image< itk::RGBPixel< TPixel >, Dim > TColorImage;
 typedef itk::Image< TPixel, Dim >                  TImage;
-typedef itk::ImageToVTKImageFilter< TColorImage >  TVTKImage;
 
 // -------------------------------------------------------------------------
 int main( int argc, char* argv[] )
@@ -50,99 +36,49 @@ int main( int argc, char* argv[] )
   bool stop_at_one_front = ( std::atoi( argv[ 3 ] ) != 0 );
 
   // Read image
-  itk::ImageFileReader< TColorImage >::Pointer input_image_reader =
-    itk::ImageFileReader< TColorImage >::New( );
-  input_image_reader->SetFileName( input_image_fn );
-  try
+  TColorImage::Pointer input_image;
+  std::string err = fpa_Utility::ReadImage( input_image, input_image_fn );
+  if( err != "" )
   {
-    input_image_reader->Update( );
-  }
-  catch( itk::ExceptionObject& err )
-  {
-    std::cerr
-      << "Error while reading image from " << input_image_fn << ": "
-      << err << std::endl;
+    std::cerr << err << std::endl;
     return( 1 );
 
-  } // yrt
-  TColorImage::ConstPointer input_image = input_image_reader->GetOutput( );
-  TVTKImage::Pointer vtk_input_image = TVTKImage::New( );
+  } // fi
+
+  // Show image and wait for, at least, one seed
+  itk::ImageToVTKImageFilter< TColorImage >::Pointer vtk_input_image =
+    itk::ImageToVTKImageFilter< TColorImage >::New( );
   vtk_input_image->SetInput( input_image );
   vtk_input_image->Update( );
 
-  // VTK visualization
-  vtkSmartPointer< vtkImageActor > actor =
-    vtkSmartPointer< vtkImageActor >::New( );
-  actor->SetInputData( vtk_input_image->GetOutput( ) );
-
-  vtkSmartPointer< vtkRenderer > renderer =
-    vtkSmartPointer< vtkRenderer >::New( );
-  renderer->SetBackground( 0.1, 0.2, 0.7 );
-  renderer->AddActor( actor );
-  vtkSmartPointer< vtkRenderWindow > window =
-    vtkSmartPointer< vtkRenderWindow >::New( );
-  window->SetSize( 800, 800 );
-  window->AddRenderer( renderer );
-
-  // Correct camera due to the loaded image
-  vtkCamera* camera = renderer->GetActiveCamera( );
-  camera->SetViewUp( 0, -1, 0 );
-  camera->SetPosition( 0, 0, -1 );
-  camera->SetFocalPoint( 0, 0, 0 );
-
-  // VTK interaction
-  vtkSmartPointer< vtkInteractorStyleImage > imageStyle =
-    vtkSmartPointer< vtkInteractorStyleImage >::New( );
-  vtkSmartPointer< vtkRenderWindowInteractor > interactor =
-    vtkSmartPointer< vtkRenderWindowInteractor >::New( );
-  interactor->SetInteractorStyle( imageStyle );
-  window->SetInteractor( interactor );
-
-  // Create the widget and its representation
-  vtkSmartPointer< vtkPointHandleRepresentation3D > handle =
-    vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
-  handle->GetProperty( )->SetColor( 1, 0, 0 );
-  vtkSmartPointer< vtkSeedRepresentation > rep =
-    vtkSmartPointer< vtkSeedRepresentation >::New( );
-  rep->SetHandleRepresentation( handle );
-
-  vtkSmartPointer< vtkSeedWidget > widget =
-    vtkSmartPointer< vtkSeedWidget >::New( );
-  widget->SetInteractor( interactor );
-  widget->SetRepresentation( rep );
-
-  // Let some interaction
-  interactor->Initialize( );
-  renderer->ResetCamera( );
-  window->Render( );
-  widget->On( );
-  interactor->Start( );
+  fpa_Utility::Viewer2DWithSeeds viewer;
+  viewer.SetImage( vtk_input_image->GetOutput( ) );
+  while( viewer.GetNumberOfSeeds( ) == 0 )
+    viewer.Start( );
+
+  // Region growing types
+  typedef fpa::Image::RegionGrow< TColorImage, TImage > TFilter;
+  typedef fpa::Image::Functors::
+    RegionGrowAllBelongsFunction< TColorImage > TFunction;
 
   // Prepare region grow function
-  typedef fpa::Base::Functors::TautologyFunction< TColorImage::PixelType > TFunction;
   TFunction::Pointer function = TFunction::New( );
 
   // Prepare region grow filter
-  typedef fpa::Image::RegionGrow< TColorImage, TImage > TFilter;
   TFilter::Pointer filter = TFilter::New( );
   filter->SetInput( input_image );
-  filter->SetMembershipFunction( function );
+  filter->SetGrowingFunction( function );
   filter->SetNeighborhoodOrder( neighborhood_order );
   filter->SetOutsideValue( TPixel( 0 ) );
   filter->SetInsideValue( std::numeric_limits< TPixel >::max( ) );
   filter->SetStopAtOneFront( stop_at_one_front );
 
-  // Get user-given seeds
-  for( unsigned int s = 0; s < rep->GetNumberOfSeeds( ); s++ )
+  // Associate seeds
+  for( unsigned long s = 0; s < viewer.GetNumberOfSeeds( ); ++s )
   {
-    double pos[ 3 ];
-    rep->GetSeedWorldPosition( s, pos );
-
     TImage::PointType pnt;
-    pnt[ 0 ] = TImage::PointType::ValueType( pos[ 0 ] );
-    pnt[ 1 ] = TImage::PointType::ValueType( pos[ 1 ] );
-
     TImage::IndexType idx;
+    viewer.GetSeed( pnt, s );
     if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
       filter->AddSeed( idx, 0 );
 
@@ -151,14 +87,16 @@ int main( int argc, char* argv[] )
   // Prepare graphical debugger
   typedef fpa::VTK::Image2DObserver< TFilter, vtkRenderWindow > TDebugger;
   TDebugger::Pointer debugger = TDebugger::New( );
-  debugger->SetRenderWindow( window );
-  debugger->SetRenderPercentage( 0.001 );
+  debugger->SetRenderWindow( viewer.Window );
+  debugger->SetRenderPercentage( 0.01 );
   filter->AddObserver( itk::AnyEvent( ), debugger );
   filter->ThrowEventsOn( );
 
   // Go!
   filter->Update( );
 
+  // Some more interaction and finish
+  viewer.Start( );
   return( 0 );
 }