You are on page 1of 41

ITK and Graphical User Interface

Luis Ibez William Schroeder Insight Software Consortium

Insight
ITK is not Visualization ITK is not Graphic Interface ITK is image Segmentation and Registration

ITK + Graphic Interface

Qt http://www.trolltech.com FLTK http://www.fltk.org GUI Layer

ITK Layer

ITK + FLTK

Starting your own project


Download and Install FLTK
(Select the same compilation mode as ITK: Debug, Release)

Create a clean new directory Write a CMakeLists.txt file Write a simple .cxx file Create a GUI with fluid Configure with CMake Build

Step 1. Writing CMakeLists.txt


PROJECT( myProject ) FIND_PACKAGE ( ITK ) IF ( ITK_FOUND ) INCLUDE( ${USE_ITK_FILE} ) ENDIF( ITK_FOUND ) FIND_PACKAGE ( FLTK ) IF ( FLTK_FOUND ) INCLUDE_DIRECTORIES( ${FLTK_INCLUDE_DIR} ) ENDIF( FLTK_FOUND ) (continue...)

Step 1. Writing CMakeLists.txt


(continue...) ADD_EXECUTABLE( myProject myProject.cxx ) IF ( FLTK_FOUND ) FLTK_WRAP_UI( myProject myProjectGUI.fl ) ENDIF ( FLTK_FOUND ) TARGET_LINK_LIBRARIES( myProject ITKIO ITKBasicFilters ITKNumerics ITKCommon ${FLTK_LIBRARIES} )

Step 2. Writing myProject.cxx


#include "myProjectGUI.h" #include "itkImageFileReader.h" #include "itkImage.h" #include "itkCurvatureFlowImageFilter.h" int main( { typedef typedef typedef int argc, char ** argv ) itk::Image< float, 2 > ImageType; itk::ImageFileReader< ImageType > ReaderType; itk::CurvatureFlowImageFilter< ImageType, ImageType > SmootherFilterType; reader = ReaderType::New();

ReaderType::Pointer

Step 2. Writing myProject.cxx


SmootherFilterType::Pointer smoother = SmootherFilterType::New(); reader->SetFileName( argv[1] ); smoother->SetInput( reader->GetOutput() ); smoother->SetNumberOfIterations( 7 ); smoother->SetTimeStep( 0.5 ); myProjectGUI gui.Show(); Fl::run(); return 0; } gui;

Step 3. Running Fluid

Step 4. Running CMake

Step 4. Running CMake


Provide ITK_DIR Provide FLTK_INCLUDE_DIR Provide FLTK_FLUID_EXECUTABLE Click on Configure button

Step 4. Running CMake

Step 4. Running CMake

Step 4. Running CMake


Click on Configure button Click on OK button

Step 5. Building the Project


Open myProject.dsw generated by CMake Select ALL_BUILD Build the project

Step 6. Connecting FLTK to ITK


itk::ProcessObject Fl_Slider

itk::FilterX

mySlider
MemberCommand<mySlider>

AddObserver( ProgressEvent, . )

Step 6. Connecting FLTK to ITK


#include "itkCommand.h" #include <FL/Fl_Slider.H> namespace fltk { class ProgressBar : public Fl_Slider { public: typedef itk::MemberCommand< ProgressBar > RedrawCommandType; ProgressBar(int x, int y, int w, int h, char * label=0); void ProcessEvent( itk::Object * , const itk::EventObject & ); void Observe( itk::Object *caller ); private: RedrawCommandType::Pointer m_RedrawCommand; }; } // end namespace fltk

Step 6. Connecting FLTK to ITK


#include "fltkProgressBar.h" #include "itkProcessObject.h" #include <FL/Fl.H> namespace fltk { ProgressBar::ProgressBar(int x, int y, int w, int h, char * label): Fl_Slider( x, y, w, h, label ) { m_RedrawCommand = RedrawCommandType::New(); m_RedrawCommand->SetCallbackFunction( this, & ProgressBar::ProcessEvent ); }

Step 6. Connecting FLTK to ITK


void ProgressBar::ProcessEvent( { if( typeid( itk::ProgressEvent ) == typeid( event ) ) { ::itk::ProcessObject::Pointer process = dynamic_cast< ::itk::ProcessObject *>( caller ); this->value( process->GetProgress() ); this->redraw(); Fl::check(); } } itk::Object * caller, const itk::EventObject & event

Step 6. Connecting FLTK to ITK

void ProgressBar::Observe( itk::Object * caller ) { caller->AddObserver( itk::ProgressEvent(), m_RedrawCommand.GetPointer() ); }

Step 6. Connecting FLTK to ITK


[ myProject.cxx ]: SmootherFilterType::Pointer smoother = SmootherFilterType::New(); smoother->SetInput( reader->GetOutput() ); myProjectGUI gui.Show(); gui;

gui.progressBar->Observe( smoother ); gui.SetFilter( smoother ); Fl::run();

Step 7. Extend GUI with Fluid

ITK + Qt

Starting your own project


Download and Install Qt Create a clean new directory Write a CMakeLists.txt file Write a simple .cxx file Configure with CMake Build Run

Step 1. Writing CmakeLists.txt


PROJECT( myProject ) FIND_PACKAGE ( ITK ) IF ( ITK_FOUND ) INCLUDE( ${USE_ITK_FILE} ) ENDIF( ITK_FOUND ) FIND_PACKAGE ( QT ) IF ( QT_FOUND ) INCLUDE_DIRECTORIES( ${QT_INCLUDE_DIR} ) ENDIF( QT_FOUND ) LINK_LIBRARIES ( ITKIO ${QT_LIBRARIES} ) (continue...)

Step 1. Writing CMakeLists.txt


(continue...) SET( QtITK_SRCS itkQtProgressBar.cxx qtITK.cxx ) SET( QtITK_MOC_SRCS itkQtAdaptor.h itkQtLightIndicator.h ) IF( QT_WRAP_CPP ) QT_WRAP_CPP( QtITK ${QtITK_SRCS} ${QtITK_MOC_SRCS } ) ENDIF( QT_WRAP_CPP ) ADD_EXECUTABLE( QtITK QtITK_SRCS )

Step 1. Running CMake

Step 1. Running CMake

Step 1. Running CMake


Provide ITK_DIR Provide QT_INCLUDE_DIR Provide QT_MOC_EXECUTABLE Provide QT_UIC_EXECUTABLE Provide QT_QTMAIN_LIBRARY Provide QT_QT_LIBRARY

Qt Communications
Qobject
MethodA() MethodX() MethodY() MethodZ() MethodW() MethodK()

Qobject Signals Slots

Signals Slots

MethodB() MethodC() MethodD() MethodE()

Qt - ITK Communications
QT Signals ITK InvokeEvent

Slots

Observers

Qt ITK Communications
Qobject Signals
MethodA() MethodB() MethodC() MethodD() MethodE() MethodX() MethodY()

itk::Object

Qt ITK Adaptor

MethodZ() MethodW() MethodK()

Slots

Qt ITK Communications
Slots
MethodA() MethodB() MethodC()

itk::Object Qt ITK Adaptor


MethodX() MethodY() MethodZ()

Slot Adaptor

Qt ITK Communications

Signals
MethodA() MethodB() Command EventP() EventQ() EventR()

itk::Object

Qt MethodC() ITK Adaptor

Signal Adaptor

Qt ITK Communications
Qobject

QtTranslator

QtSlotAdaptor< T >

QtSignalAdaptor

Step 2. Writing myProject.cxx


#include <qapplication.h> #include <qpushbutton.h> #include "itkImage.h" #include "itkAddImageFilter.h" #include "itkQtAdaptor.h" int main(int argc, char **argv) { typedef itk::Image< float, 2 > ImageType; typedef itk::AddImageFilter<ImageType,ImageType,ImageType> FilterType; QApplication app( argc, argv ); QWidget mainwidget; mainwidget.resize(620,100);

Step 2. Writing myProject.cxx


QPushButton bb( "Start", &mainwidget ); bb.setGeometry( horizontalPosition, 20, buttonWidth, buttonHeight ); typedef itk::QtSlotAdaptor< FilterType > SlotAdaptorType; SlotAdaptorType slotAdaptor; slotAdaptor.SetCallbackFunction( filter, & FilterType::Update ); QObject::connect( &bb, SIGNAL(clicked()), &slotAdaptor, SLOT(Slot())); app.setMainWidget( &mainwidget ); mainwidget.show(); return app.exec(); }

Step 3. Creating Qt-ITK widgets


itk::ProcessObject QProgressBar

itk::FilterX

itk::QtProgressBar
MemberCommand<QtProgressBar>

AddObserver( ProgressEvent, . )

Step 3. Creating Qt-ITK widgets


itk::ProcessObject QButton

itk::FilterX Qt ITK Adaptor

itk::QtLightIndicator
Modified() Start() End()

AddObserver( ModifiedEvent, . ) AddObserver( StartEvent, . ) AddObserver( EndEvent, . )

Slots

Enjoy ITK !

You might also like