#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[] )
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 );
// 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 );
}