ITK/Using ITK from .NET

From KitwarePublic
< ITK
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

This page describes how to use ITK from .NET.
NOTE: You must build ITK, wrapper DLL, and .NET exe all using the same target platform i.e. Win32/x86 or Win64/x64

  1. Download CMake, ITK source code, and SWIG
  2. Build ITK (see here for help)
  3. Create the following CMakeLists.txt file:

    <syntaxhighlight lang="make">

    1. File: CMakeLists.txt

    cmake_minimum_required(VERSION 2.8)

    project(ExampleWrapper)

    find_package(ITK REQUIRED) include(${ITK_USE_FILE})

    add_library(ExampleWrapper SHARED example.h example.hxx example_wrap.cxx) target_link_libraries(ExampleWrapper ${ITK_LIBRARIES}) </syntaxhighlight>

  4. Create the following example.h file:

    <syntaxhighlight lang="cpp"> // File : example.h

    1. ifndef __example_h
    2. define __example_h
    1. include <string>

    template<class TPixel, unsigned int VDimension> void SmoothImage(

       const std::string input, const std::string output, const double sigma
    

    );

    1. include "example.hxx"
    1. endif // __example_h

    </syntaxhighlight>

  5. Create the following example.hxx file:

    <syntaxhighlight lang="cpp">

    1. ifndef __example_hxx
    2. define __example_hxx
    1. include "example.h"
    1. include "itkImage.h"
    2. include "itkImageFileReader.h"
    3. include "itkImageFileWriter.h"
    4. include "itkSmoothingRecursiveGaussianImageFilter.h"

    template<class TPixel, unsigned int VDimension> void SmoothImage(

       const std::string input, const std::string output, const double sigma
    

    ) {

       // Read input
       typedef itk::Image<TPixel,VDimension> ImageType;
       typedef itk::ImageFileReader<ImageType> ReaderType;
       ReaderType::Pointer reader = ReaderType::New();
       reader->SetFileName(input);
       reader->Update();
    
       // Apply filter
       typedef itk::SmoothingRecursiveGaussianImageFilter<ImageType> FilterType;
       FilterType::Pointer filter = FilterType::New();
       filter->SetInput(reader->GetOutput());
       filter->SetSigma(sigma);
       filter->Update();
    
       // Write output
       typedef itk::ImageFileWriter<ImageType> WriterType;
       WriterType::Pointer writer = WriterType::New();
       writer->SetInput(filter->GetOutput());
       writer->SetFileName(output);
       writer->Update();
    

    }

    1. endif // __example_hxx

    </syntaxhighlight>

  6. Create the following example.i file (instructs SWIG how to generate the wrapper):

    <syntaxhighlight lang="cpp"> // File : example.i %module example %include "std_string.i"

    %{

    1. include "example.h"

    %}

    %include "example.h"

    %template(SmoothImageUC2)SmoothImage<unsigned char, 2>; %template(SmoothImageF2) SmoothImage<float, 2>; </syntaxhighlight>

  7. Run SWIG using the following command: swig -c++ -csharp -dllimport ExampleWrapper example.i
    The following files should be generated:
    • example_wrap.cxx
    • example.cs
    • examplePINVOKE.cs
  8. Run CMake, configure and generate, build the project. The result should be ExampleWrapper.dll
  9. Create the following C# runme.cs file:

    <syntaxhighlight lang="csharp"> // File: runme.cs using System;

    public class runme {

       [STAThread()]
       static void Main() {
           try {
               example.SmoothImageUC2(
                   input: "C:/Temp/cthead1.png",
                   output: "C:/Temp/cthead1-smooth.png",
                   sigma: 5.0
               );
           } catch (Exception ex) {
               Console.WriteLine(ex);
           }
       }
    

    } </syntaxhighlight>

  10. Build the .NET executable. For Mono use the following: mcs -platform:x86 -target:exe -out:example.exe runme.cs example.cs examplePINVOKE.cs
  11. Run the .NET executable. Make sure it can find ExampleWrapper.dll (the easiest way is to copy the dll to the same folder as example.exe)