marks->Allocate( );
marks->FillBuffer( _TMark( 0 ) );
- // Iterate over the candidates, starting fromt the candidates that
+ // Iterate over the candidates, starting from the candidates that
// are near thin branches
_TCandidates::const_reverse_iterator cIt =
this->m_Candidates.rbegin( );
- for( int leo = 0; leo < 100 && cIt != this->m_Candidates.rend( ); ++cIt )
+ for( int leo = 0; leo < 1 && cIt != this->m_Candidates.rend( ); ++cIt )
{
// If pixel hasn't been visited, continue
TVertex v = cIt->second;
unsigned int nN = 1;
for( unsigned int d = 0; d < TImage::ImageDimension; ++d )
nN *= iIt.GetSize( )[ d ];
- TImage::PixelType min_value = iIt.GetPixel( 0 );
- TVertex min_vertex = iIt.GetIndex( 0 );
- if( !( min_value > TImage::PixelType( 0 ) ) )
- min_value = std::numeric_limits< TImage::PixelType >::max( );
+ TVertex max_vertex = iIt.GetIndex( 0 );
+ TImage::PixelType max_value = iIt.GetPixel( 0 );
for( unsigned int i = 1; i < nN; ++i )
{
TImage::PixelType value = iIt.GetPixel( i );
- if( !( value > TImage::PixelType( 0 ) ) )
- value = std::numeric_limits< TImage::PixelType >::max( );
- if( value < min_value )
+ if( value > max_value )
{
- min_value = value;
- min_vertex = iIt.GetIndex( i );
+ max_value = value;
+ max_vertex = iIt.GetIndex( i );
} // fi
} // rof
- if( min_value < std::numeric_limits< TImage::PixelType >::max( ) )
+ if( marks->GetPixel( max_vertex ) != _TMark( 0 ) )
+ continue;
+ leo++;
+ std::cout << "Leaf: " << leo << " " << max_value << " " << max_vertex << std::endl;
+
+ bool start = true;
+ do
{
- if( marks->GetPixel( min_vertex ) != _TMark( 0 ) )
- continue;
- leo++;
- std::cout << "Leaf: " << leo << " " << min_value << " " << min_vertex << std::endl;
+ double dist = double( 1.5 ) * std::sqrt( double( input->GetPixel( max_vertex ) ) );
+ for( unsigned int d = 0; d < TImage::ImageDimension; ++d )
+ radius[ d ] =
+ ( unsigned long )( dist / spacing[ d ] ) + 1;
+ itk::NeighborhoodIterator< _TMarkImage > mIt(
+ radius, marks, marks->GetRequestedRegion( )
+ );
+ mIt.SetLocation( max_vertex );
+ nN = 1;
+ for( unsigned int d = 0; d < TImage::ImageDimension; ++d )
+ nN *= mIt.GetSize( )[ d ];
+ for( unsigned int i = 0; i < nN; ++i )
+ if( marks->GetRequestedRegion( ).IsInside( mIt.GetIndex( i ) ) )
+ {
+ mIt.SetPixel( i, ( start )? 255: 100 );
+ start = false;
+ }
- bool start = true;
- do
- {
- double dist = double( 1.5 ) * std::sqrt( double( input->GetPixel( min_vertex ) ) );
- for( unsigned int d = 0; d < TImage::ImageDimension; ++d )
- radius[ d ] =
- ( unsigned long )( dist / spacing[ d ] ) + 1;
- itk::NeighborhoodIterator< _TMarkImage > mIt(
- radius, marks, marks->GetRequestedRegion( )
- );
- mIt.SetLocation( min_vertex );
- nN = 1;
+ /*
+ TImage::SizeType radius;
+ mIt.GoToBegin( );
+ mIt.SetLocation( vIt );
+
+ TImage::SizeType size = mIt.GetSize( );
+ unsigned int nN = 1;
for( unsigned int d = 0; d < TImage::ImageDimension; ++d )
- nN *= mIt.GetSize( )[ d ];
+ nN *= size[ d ];
for( unsigned int i = 0; i < nN; ++i )
- if( marks->GetRequestedRegion( ).IsInside( mIt.GetIndex( i ) ) )
- {
- mIt.SetPixel( i, ( start )? 255: 100 );
- start = false;
- }
-
- /*
- TImage::SizeType radius;
- mIt.GoToBegin( );
- mIt.SetLocation( vIt );
-
- TImage::SizeType size = mIt.GetSize( );
- unsigned int nN = 1;
- for( unsigned int d = 0; d < TImage::ImageDimension; ++d )
- nN *= size[ d ];
- for( unsigned int i = 0; i < nN; ++i )
- if( marks->GetRequestedRegion( ).IsInside( mIt.GetIndex( i ) ) )
- mIt.SetPixel( i, ( start )? 255: 100 );
+ if( marks->GetRequestedRegion( ).IsInside( mIt.GetIndex( i ) ) )
+ mIt.SetPixel( i, ( start )? 255: 100 );
- start = false;
- */
- // Next vertex in current path
- min_vertex = this->_Parent( min_vertex );
+ start = false;
+ */
+ // Next vertex in current path
+ max_vertex = this->_Parent( max_vertex );
- } while( min_vertex != this->_Parent( min_vertex ) );
- }
- else
- marks->SetPixel( v, _TMark( 1 ) );
+ } while( max_vertex != this->_Parent( max_vertex ) );
} // rof
+ /*
+ else
+ marks->SetPixel( v, _TMark( 1 ) );
+ } // rof
+ */
itk::ImageFileWriter< _TMarkImage >::Pointer w =
itk::ImageFileWriter< _TMarkImage >::New( );
w->SetInput( marks );
w->SetFileName( "marks.mhd" );
w->Update( );
- std::exit( 1 );
/*
{
// Configure observer
TDijkstraObs::Pointer obs = TDijkstraObs::New( );
- obs->SetImage( input_image, view.GetWindow( ) );
+ obs->SetRenderWindow( view.GetWindow( ) );
paths->AddObserver( itk::AnyEvent( ), obs );
paths->ThrowEventsOn( );
}
#ifndef __FPA__VTK__IMAGE3DOBSERVER__HXX__
#define __FPA__VTK__IMAGE3DOBSERVER__HXX__
+#include <itkImageBase.h>
+
#include <vtkCellArray.h>
+#include <vtkFloatArray.h>
+#include <vtkPointData.h>
#include <vtkPoints.h>
-#include <vtkProperty.h>
#include <vtkRenderer.h>
#include <vtkRendererCollection.h>
+
/*
#include <vtkCellArray.h>
- #include <vtkPolyDataMapper.h>
- #include <vtkPoints.h>
- #include <vtkPointData.h>
+ #include <vtkProperty.h>
*/
// -------------------------------------------------------------------------
template< class F, class R >
void fpa::VTK::Image3DObserver< F, R >::
-SetImage( const TImage* img, R* rw )
+SetRenderWindow( R* rw )
{
- this->m_Image = img;
this->m_RenderWindow = rw;
- this->m_Vertices.clear( );
-
/*
- unsigned int minD = TImage::ImageDimension;
- minD = ( minD < 3 )? minD: 3;
-
- int e[ 6 ] = { 0 };
- typename TImage::RegionType reg = this->m_Image->GetRequestedRegion( );
- for( unsigned int i = 0; i < minD; i++ )
+ if( this->m_RenderWindow != NULL )
{
- e[ ( i << 1 ) + 0 ] = reg.GetIndex( )[ i ];
- e[ ( i << 1 ) + 1 ] = reg.GetIndex( )[ i ] + reg.GetSize( )[ i ] - 1;
-
- } // rof
-
- typename TImage::SpacingType spac = this->m_Image->GetSpacing( );
- double s[ 3 ] = { 1, 1, 1 };
- for( unsigned int i = 0; i < minD; i++ )
- s[ i ] = double( spac[ i ] );
-
- typename TImage::PointType orig = this->m_Image->GetOrigin( );
- double o[ 3 ] = { 0 };
- for( unsigned int i = 0; i < minD; i++ )
- o[ i ] = double( orig[ i ] );
-
- this->m_Stencil->SetExtent( e );
- this->m_Stencil->SetSpacing( s );
- this->m_Stencil->SetOrigin( o );
- this->m_Stencil->AllocateScalars( VTK_UNSIGNED_CHAR, 4 );
- for( unsigned int i = 0; i < 3; i++ )
- this->m_Stencil->GetPointData( )->
- GetScalars( )->FillComponent( i, 255 );
- this->m_Stencil->GetPointData( )->GetScalars( )->FillComponent( 3, 0 );
-
- this->m_StencilActor->SetInputData( this->m_Stencil );
- this->m_StencilActor->InterpolateOff( );
- */
-
- double nPix =
- double( this->m_Image->GetRequestedRegion( ).GetNumberOfPixels( ) );
- this->m_Percentage = ( unsigned long )( nPix * 0.001 );
- this->m_Number = 0;
-
- if( this->m_RenderWindow != NULL )
- {
vtkRenderer* ren =
- this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
+ this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
+ if( ren != NULL )
+ {
ren->AddActor( this->m_PolyDataActor );
- this->Render( );
+ this->m_RenderWindow->Render( );
- } // fi
-}
+ } // fi
-// -------------------------------------------------------------------------
-template< class F, class R >
-void fpa::VTK::Image3DObserver< F, R >::
-Render( )
-{
- if( this->m_RenderWindow != NULL )
- this->m_RenderWindow->Render( );
+ } // fi
+ */
}
// -------------------------------------------------------------------------
void fpa::VTK::Image3DObserver< F, R >::
Execute( const itk::Object* c, const itk::EventObject& e )
{
- typedef typename TImage::IndexType TIndex;
- typedef typename TImage::PointType TPoint;
- typedef typename TFilter::TEvent TEvent;
- typedef typename TFilter::TFrontEvent TFrontEvent;
- typedef typename TFilter::TMarkEvent TMarkEvent;
- typedef typename TFilter::TCollisionEvent TCollisionEvent;
- typedef typename TFilter::TEndEvent TEndEvent;
-
+ typedef itk::ImageBase< 3 > _TImage;
+ typedef typename F::TEvent _TEvent;
+ typedef typename F::TFrontEvent _TFrontEvent;
+ typedef typename F::TMarkEvent _TMarkEvent;
+ typedef typename F::TCollisionEvent _TCollisionEvent;
+ typedef typename F::TEndEvent _TEndEvent;
+
+ // Check inputs
if( this->m_RenderWindow == NULL )
return;
+ vtkRenderer* ren =
+ this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
+ if( ren == NULL )
+ return;
+ const F* filter = dynamic_cast< const F* >( c );
+ if( filter == NULL )
+ return;
+ const _TImage* image = filter->GetInput( );
+ if( image == NULL )
+ return;
- const TEvent* evt = dynamic_cast< const TEvent* >( &e );
- TFrontEvent fevt;
- TMarkEvent mevt;
- TCollisionEvent cevt;
- TEndEvent eevt;
- if( evt != NULL )
+ // Create actor
+ _TImage::RegionType reg = image->GetLargestPossibleRegion( );
+ _TImage::SizeType siz = reg.GetSize( );
+ if( this->m_Data.GetPointer( ) == NULL )
{
- typename TImage::PointType pnt;
- this->m_Image->TransformIndexToPhysicalPoint( evt->Node.Vertex, pnt );
+ this->m_Data = vtkSmartPointer< vtkPolyData >::New( );
+ this->m_Mapper = vtkSmartPointer< vtkPolyDataMapper >::New( );
+ this->m_Actor = vtkSmartPointer< vtkActor >::New( );
+
+ vtkSmartPointer< vtkPoints > points =
+ vtkSmartPointer< vtkPoints >::New( );
+ vtkSmartPointer< vtkCellArray > vertices =
+ vtkSmartPointer< vtkCellArray >::New( );
+ vtkSmartPointer< vtkFloatArray > scalars =
+ vtkSmartPointer< vtkFloatArray >::New( );
+ this->m_Data->SetPoints( points );
+ this->m_Data->SetVerts( vertices );
+ this->m_Data->GetPointData( )->SetScalars( scalars );
+
+ this->m_Mapper->SetInputData( this->m_Data );
+ this->m_Actor->SetMapper( this->m_Mapper );
+ ren->AddActor( this->m_Actor );
+
+ this->m_Marks = TMarks::New( );
+ this->m_Marks->SetLargestPossibleRegion(
+ image->GetLargestPossibleRegion( )
+ );
+ this->m_Marks->SetRequestedRegion( image->GetRequestedRegion( ) );
+ this->m_Marks->SetBufferedRegion( image->GetBufferedRegion( ) );
+ this->m_Marks->SetOrigin( image->GetOrigin( ) );
+ this->m_Marks->SetSpacing( image->GetSpacing( ) );
+ this->m_Marks->SetDirection( image->GetDirection( ) );
+ this->m_Marks->Allocate( );
+ this->m_Marks->FillBuffer( -1 );
+
+ } // fi
+
+ // Get possible events
+ const _TEvent* evt = dynamic_cast< const _TEvent* >( &e );
+ _TFrontEvent fevt;
+ _TMarkEvent mevt;
+ _TCollisionEvent cevt;
+ _TEndEvent eevt;
+ if( evt != NULL )
+ {
if( fevt.CheckEvent( evt ) )
{
- if(
- this->m_Vertices.find( evt->Node.Vertex ) == this->m_Vertices.end( )
- )
+ if( this->m_Marks->GetPixel( evt->Node.Vertex ) == -1 )
{
- unsigned long pId = this->m_PolyData->GetPoints( )->InsertNextPoint(
- double( pnt[ 0 ] ), double( pnt[ 1 ] ), double( pnt[ 2 ] )
- );
- unsigned long cId = this->m_PolyData->GetVerts( )->InsertNextCell( 1 );
- this->m_PolyData->GetVerts( )->InsertCellPoint( pId );
- this->m_PolyData->Modified( );
- this->m_Vertices[ evt->Node.Vertex ] = TVertexIds( pId, cId );
-
- } // rof
+ typename _TImage::PointType pnt;
+ image->TransformIndexToPhysicalPoint( evt->Node.Vertex, pnt );
+
+ long pId = this->m_Data->GetNumberOfPoints( );
+ this->m_Data->GetVerts( )->InsertNextCell( 1 );
+ this->m_Data->GetVerts( )->InsertCellPoint( pId );
+ this->m_Data->GetPoints( )->
+ InsertNextPoint( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] );
+ this->m_Data->GetPointData( )->
+ GetScalars( )->InsertNextTuple1( 0.5 );
+ this->m_Data->Modified( );
+
+ this->m_Marks->SetPixel( evt->Node.Vertex, pId );
+
+ } // fi
+ this->m_RenderWindow->Render( );
+
+ /* TODO
+ if(
+ this->m_Vertices.find( evt->Node.Vertex ) == this->m_Vertices.end( )
+ )
+ {
+ unsigned long pId = this->m_PolyData->GetPoints( )->InsertNextPoint(
+ double( pnt[ 0 ] ), double( pnt[ 1 ] ), double( pnt[ 2 ] )
+ );
+ unsigned long cId = this->m_PolyData->GetVerts( )->InsertNextCell( 1 );
+ this->m_PolyData->GetVerts( )->InsertCellPoint( pId );
+ this->m_PolyData->Modified( );
+ this->m_Vertices[ evt->Node.Vertex ] = TVertexIds( pId, cId );
+
+ } // rof
+ */
}
else if( mevt.CheckEvent( evt ) )
{
if( cevt.CheckEvent( evt ) )
{
- // std::cout << "Collision";
+ // TODO: std::cout << "collision" << std::endl;
+
} // fi
/*
this->SetPixel(
*/
// Update visualization
- if( this->m_Number == 0 || this->m_Percentage < 0 )
- this->Render( );
- this->m_Number++;
- this->m_Number %= this->m_Percentage;
-
- if( eevt.CheckEvent( evt ) )
- {
- if( this->m_RenderWindow != NULL )
- {
- vtkRenderer* ren =
- this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
- ren->RemoveActor( this->m_PolyDataActor );
- this->Render( );
-
- } // fi
-
- } // fi
+ /* TODO
+ if( this->m_Number == 0 || this->m_Percentage < 0 )
+ this->Render( );
+ this->m_Number++;
+ this->m_Number %= this->m_Percentage;
+ if( eevt.CheckEvent( evt ) )
+ {
+ if( this->m_RenderWindow != NULL )
+ {
+ vtkRenderer* ren =
+ this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
+ ren->RemoveActor( this->m_PolyDataActor );
+ this->Render( );
+
+ } // fi
+
+ } // fi
+ */
} // fi
}
fpa::VTK::Image3DObserver< F, R >::
Image3DObserver( )
: Superclass( ),
- m_RenderWindow( NULL ),
- m_Number( 0 ),
- m_Percentage( 0 )
+ m_RenderWindow( NULL )
{
- this->m_PolyData = vtkSmartPointer< vtkPolyData >::New( );
- this->m_PolyDataMapper = vtkSmartPointer< vtkPolyDataMapper >::New( );
- this->m_PolyDataActor = vtkSmartPointer< vtkActor >::New( );
+ /*
+ this->m_PolyData = vtkSmartPointer< vtkPolyData >::New( );
+ this->m_PolyDataMapper = vtkSmartPointer< vtkPolyDataMapper >::New( );
+ this->m_PolyDataActor = vtkSmartPointer< vtkActor >::New( );
- this->m_PolyData->SetPoints( vtkPoints::New( ) );
- this->m_PolyData->SetVerts( vtkCellArray::New( ) );
+ this->m_PolyData->SetPoints( vtkPoints::New( ) );
+ this->m_PolyData->SetVerts( vtkCellArray::New( ) );
- this->m_PolyDataMapper->SetInputData( this->m_PolyData );
- this->m_PolyDataActor->SetMapper( this->m_PolyDataMapper );
- this->m_PolyDataActor->GetProperty( )->SetColor( 0, 0, 1 );
+ this->m_PolyDataMapper->SetInputData( this->m_PolyData );
+ this->m_PolyDataActor->SetMapper( this->m_PolyDataMapper );
+ this->m_PolyDataActor->GetProperty( )->SetColor( 0, 0, 1 );
+ */
}
#endif // __FPA__VTK__IMAGE3DOBSERVER__HXX__