1 // =========================================================================
2 // @author Leonardo Florez Valencia
3 // @email florez-l@javeriana.edu.co
4 // =========================================================================
6 #ifndef __fpa__tests__image__BaseFunctions__h__
7 #define __fpa__tests__image__BaseFunctions__h__
12 #include <itkImageFileReader.h>
13 #include <itkImageFileWriter.h>
15 #include <fpa/Config.h>
18 # include <itkImageToVTKImageFilter.h>
19 # include <itkVTKImageToImageFilter.h>
20 # include <vtkSmartPointer.h>
21 # include <vtkRenderWindow.h>
22 # include <ivq/VTK/ImageViewer.h>
23 # include <ivq/VTK/BrushWidget.h>
24 # include <ivq/VTK/SeedWidgetOverImageActor.h>
25 # include <fpa/Image/VisualDebugger2D.h>
35 // -------------------------------------------------------------------
36 template< class _TPointer >
39 const typename _TPointer::ObjectType::PixelType& zero,
43 typedef typename _TPointer::ObjectType _TImage;
48 typename _TImage::SizeType size;
49 for( unsigned int d = 0; d < _TImage::ImageDimension; ++d )
50 size[ d ] = va_arg( vl, int );
52 typename _TImage::SpacingType spac;
53 for( unsigned int d = 0; d < _TImage::ImageDimension; ++d )
54 spac[ d ] = va_arg( vl, double );
56 img = _TImage::New( );
57 img->SetRegions( size );
58 img->SetSpacing( spac );
60 img->FillBuffer( zero );
65 // -------------------------------------------------------------------
66 template< class _TPointer >
67 std::string Read( _TPointer& img, const std::string& fname )
69 typedef typename _TPointer::ObjectType _TImage;
70 typedef itk::ImageFileReader< _TImage > _TReader;
72 typename _TReader::Pointer reader = _TReader::New( );
73 reader->SetFileName( fname );
78 catch( std::exception& err )
80 return( err.what( ) );
83 img = reader->GetOutput( );
84 img->DisconnectPipeline( );
88 // -------------------------------------------------------------------
89 template< class _TImage >
90 std::string Write( const _TImage* img, const std::string& fname )
92 typedef itk::ImageFileWriter< _TImage > _TWriter;
94 typename _TWriter::Pointer writer = _TWriter::New( );
95 writer->SetInput( img );
96 writer->SetFileName( fname );
101 catch( std::exception& err )
103 return( err.what( ) );
109 // -------------------------------------------------------------------
112 template< class _TFilter >
116 typedef _TFilter TFilter;
117 typedef typename _TFilter::TInputImage TInputImage;
120 Viewer( const TInputImage* image )
122 this->m_VTKInputImage = TVTKInputImage::New( );
123 this->m_VTKInputImage->SetInput( image );
124 this->m_VTKInputImage->Update( );
126 this->m_Viewer = vtkSmartPointer< ivq::VTK::ImageViewer >::New( );
127 this->m_Viewer->SetInputData( this->m_VTKInputImage->GetOutput( ) );
134 void ActivateSeedWidget( )
137 vtkSmartPointer< ivq::VTK::SeedWidgetOverImageActor >::New( );
138 this->m_SeedWidget->SetActor( this->m_Viewer->GetImageActor( ) );
139 this->m_SeedWidget->SetInteractor(
140 this->m_Viewer->GetRenderWindow( )->GetInteractor( )
144 void ActivateBrushWidget( )
146 this->m_BrushWidget =
147 vtkSmartPointer< ivq::VTK::BrushWidget >::New( );
148 this->m_BrushWidget->SetImageActor( this->m_Viewer->GetImageActor( ) );
149 this->m_BrushWidget->SetInteractor(
150 this->m_Viewer->GetRenderWindow( )->GetInteractor( )
156 this->m_Viewer->Render( );
157 this->m_Viewer->ResetCamera( );
158 this->m_Viewer->Initialize( );
159 this->m_Viewer->Render( );
160 if( this->m_SeedWidget.GetPointer( ) != NULL )
161 this->m_SeedWidget->EnabledOn( );
162 if( this->m_BrushWidget.GetPointer( ) != NULL )
163 this->m_BrushWidget->EnabledOn( );
164 this->m_Viewer->Start( );
165 if( this->m_SeedWidget.GetPointer( ) != NULL )
166 this->m_SeedWidget->EnabledOff( );
167 if( this->m_BrushWidget.GetPointer( ) != NULL )
168 this->m_BrushWidget->EnabledOff( );
171 void AssociateSeedsTo( TFilter* filter )
173 if( this->m_SeedWidget.GetPointer( ) != NULL )
175 const ivq::VTK::SeedWidgetOverImageActor::TSeeds& wdg_seeds =
176 this->m_SeedWidget->GetSeeds( );
177 ivq::VTK::SeedWidgetOverImageActor::TSeeds::const_iterator wsIt;
178 for( wsIt = wdg_seeds.begin( ); wsIt != wdg_seeds.end( ); ++wsIt )
180 typename TInputImage::PointType pnt;
181 for( unsigned int i = 0; i < wsIt->second.size( ); i += 3 )
183 pnt[ 0 ] = wsIt->second[ i ];
184 pnt[ 1 ] = wsIt->second[ i + 1 ];
186 typename TInputImage::IndexType idx;
187 filter->GetInput( )->TransformPhysicalPointToIndex( pnt, idx );
188 filter->AddSeed( idx );
197 void AssociateLabelsTo( TFilter* filter )
199 if( this->m_BrushWidget.GetPointer( ) != NULL )
201 typedef typename TFilter::TLabelImage _TLabelImage;
202 typedef itk::VTKImageToImageFilter< _TLabelImage > TITKImage;
203 typename TITKImage::Pointer itk_image = TITKImage::New( );
204 itk_image->SetInput( this->m_BrushWidget->GetCanvas( ) );
205 itk_image->Update( );
206 filter->SetLabels( itk_image->GetOutput( ) );
211 void ObserveFilter( TFilter* filter )
213 typedef fpa::Image::VisualDebugger2D< TFilter > _TDeb;
214 typedef typename TFilter::TEvent _TEvent;
215 typename _TDeb::Pointer deb = _TDeb::New( );
216 deb->SetVisualization(
217 this->m_Viewer->GetRenderer( ),
218 this->m_Viewer->GetRenderWindow( )->GetInteractor( )
220 this->m_Observer1 = filter->AddObserver( itk::StartEvent( ), deb );
221 this->m_Observer2 = filter->AddObserver( itk::EndEvent( ), deb );
222 this->m_Observer3 = filter->AddObserver( _TEvent( ), deb );
223 filter->VisualDebugOn( );
227 typedef itk::ImageToVTKImageFilter< TInputImage > TVTKInputImage;
228 typename TVTKInputImage::Pointer m_VTKInputImage;
229 vtkSmartPointer< ivq::VTK::ImageViewer > m_Viewer;
230 vtkSmartPointer< ivq::VTK::SeedWidgetOverImageActor > m_SeedWidget;
231 vtkSmartPointer< ivq::VTK::BrushWidget > m_BrushWidget;
232 unsigned long m_Observer1;
233 unsigned long m_Observer2;
234 unsigned long m_Observer3;
246 #endif // __fpa__tests__image__BaseFunctions__h__