ITK and GUI

Post on 08-Oct-2014

87 views 0 download

Tags:

transcript

ITK and Graphical User Interface

Luis IbáñezWilliam SchroederInsight Software Consortium

Insight

ITK is not Visualization

ITK is not Graphic Interface

ITK is image Segmentation andRegistration

ITK + Graphic Interface

GUI LayerFLTK http://www.fltk.orgQt http://www.trolltech.com

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.txtPROJECT( 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( myProjectITKIO ITKBasicFilters ITKNumerics ITKCommon${FLTK_LIBRARIES})

Step 2. Writing myProject.cxx#include "myProjectGUI.h"

#include "itkImageFileReader.h"#include "itkImage.h"#include "itkCurvatureFlowImageFilter.h"

int main( int argc, char ** argv ){typedef itk::Image< float, 2 > ImageType;typedef itk::ImageFileReader< ImageType > ReaderType;typedef itk::CurvatureFlowImageFilter<

ImageType, ImageType

> SmootherFilterType;

ReaderType::Pointer reader = ReaderType::New();

Step 2. Writing myProject.cxxSmootherFilterType::Pointer smoother =

SmootherFilterType::New();

reader->SetFileName( argv[1] );

smoother->SetInput( reader->GetOutput() );

smoother->SetNumberOfIterations( 7 );

smoother->SetTimeStep( 0.5 );

myProjectGUI gui;

gui.Show();

Fl::run();

return 0;

}

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

Fl_Slider

mySliderMemberCommand<mySlider>

itk::ProcessObject

itk::FilterX

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( itk::Object * caller,

const itk::EventObject & event )

{

if( typeid( itk::ProgressEvent ) == typeid( event ) )

{

::itk::ProcessObject::Pointer process =

dynamic_cast< ::itk::ProcessObject *>( caller );

this->value( process->GetProgress() );

this->redraw();

Fl::check();

}

}

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;gui.Show();

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

QobjectMethodX()

MethodY()

MethodZ()

MethodW()

MethodK()

Signals

Slots

MethodA()

MethodB()

MethodC()

MethodD()

MethodE()

Signals

Slots

Qobject

Qt - ITK Communications

ITK

InvokeEvent

Observers

QT

Signals

Slots

Qt – ITK Communications

QobjectMethodA()

MethodB()

MethodC()

MethodD()

MethodE()

Signals

Slots

itk::Object

MethodX()

MethodY()

MethodZ()

MethodW()

MethodK()

QtITK

Adaptor

Qt – ITK Communications

QtITK

Adaptor

itk::Object

MethodX()

MethodY()

MethodZ()

Slots

MethodA()

MethodB()

MethodC()

Slot Adaptor

Qt – ITK Communications

QtITK

Adaptor

Command

Signal Adaptor

Signals

MethodA()

MethodB()

MethodC()EventP()

EventQ()

EventR()

itk::Object

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::QtProgressBar

itk::ProcessObject

itk::FilterX

AddObserver( ProgressEvent, . )

MemberCommand<QtProgressBar>

QProgressBar

Step 3. Creating Qt-ITK widgets

itk::ProcessObject

itk::FilterX

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

QButton

itk::QtLightIndicator

Modified()Start()End()

QtITK

Adaptor

Slots

Enjoy ITK !