[Insight-users] Re: VTK ITK tcl/python connection
Luis Ibanez
luis . ibanez at kitware . com
Mon, 28 Jul 2003 09:47:55 -0400
Hi Charl,
That's great news,
We just created a directory "Visualization" under
Insight/Examples
Please feel free to add the file there. I would
suggest to use a different name, in order to match
the naming style of the other files in the Examples
directory.
For example:
CannyEdgeDetectionImageFilterAndViewer.cxx
We are adding a section on ITK+VTK integration to
the SoftwareGuide. Your example will fit well in
this section. Other C++ examples will be in the
same section.
Thanks
Luis
------------------------------
Charl P. Botha wrote:
> On Wed, 2003-07-23 at 17:58, Bill Hoffman wrote:
>
>>I would like to introduce you to Charl Botha. He has
>>already implemented a python itk/vtk integration.
>>He is looking into a more general solution based on the
>>same information I sent you. You may want to try
>
>
> Okay, it's all done. Bill, I have built and tested it on Windows VC++
> 6.0 and on g++ 2.95.4 on Debian Linux and then went and committed it. I
> had to make more changes to CableSwig.cxx to make the CableSwig and
> NoCable wrappings compatible: see CableSwig::TemplateName(). These
> changes have more advantages: it means in future we will be able to add
> similar pure Swig interface files to Insight and have the generated
> wrappings interact with and operate on CableSwig wrapped objects.
>
> I have attached a Python sample illustrating a pipeline that loads data
> in using VTK, processes it with ITK and then writes it away using VTK
> again. Where in the Insight tree could I add this?
>
> I had to add some code to the top-level CMakeLists.txt to add the
> ITK_CSWIG_CONNECTVTKITK option (if CSWIG wrapping is active) and to mark
> it as advanced. In addition, if this option is ON, the CMakeLists in
> Wrapping/CSwig has to make use of FindVTK.cmake as well.
>
> Thanks,
> Charl
>
>
>
> ------------------------------------------------------------------------
>
> # This file demonstrates how to connect VTK and ITK pipelines together
> # in scripted languages with the new ConnectVTKITK wrapping functionality.
> # Data is loaded in with VTK, processed with ITK and written back to disc
> # with VTK.
> #
> # Note that this will only work if your ITK was compiled with
> # ITK_CSWIG_CONNECTVTKITK set to ON
> #
> # -- Charl P. Botha <cpbotha AT ieee.org>
>
> import os
> import InsightToolkit as itk
> import vtk
>
> reader = vtk.vtkPNGReader()
> ITK_TOP = "/home/cpbotha/build/Insight"
> reader.SetFileName(os.path.join(ITK_TOP, "Testing/Data/Input/cthead1.png"))
>
> # it has to be a single component, itk::VTKImageImport doesn't support more
> lum = vtk.vtkImageLuminance()
> lum.SetInput(reader.GetOutput())
>
> # let's cast the output to float
> imageCast = vtk.vtkImageCast()
> imageCast.SetOutputScalarTypeToFloat()
> imageCast.SetInput(lum.GetOutput())
>
> # the end-point of this VTK pipeline segment is a vtkImageExport
> vtkExporter = vtk.vtkImageExport()
> vtkExporter.SetInput(imageCast.GetOutput())
>
> # it connects to the itk::VTKImageImport at the beginning of
> # the subsequent ITK pipeline; two-dimensional float type
> itkImporter = itk.itkVTKImageImportF2_New()
>
> # call the magic function that connects the two
> itk.ConnectVTKToITKF2(vtkExporter, itkImporter.GetPointer())
>
> canny = itk.itkCannyEdgeDetectionImageFilterF2F2_New()
> rescaler = itk.itkRescaleIntensityImageFilterF2US2_New()
> canny.SetInput(itkImporter.GetOutput())
> rescaler.SetInput(canny.GetOutput())
> rescaler.SetOutputMinimum(0)
> rescaler.SetOutputMaximum(65535)
>
> # this is to show off the new PyCommand functionality. :)
> def progressEvent():
> print canny.GetProgress()
>
> pc = itk.itkPyCommand_New()
> pc.SetCommandCallable(progressEvent)
> canny.AddObserver(itk.itkProgressEvent(), pc.GetPointer())
> # end of show-off
>
> # this will form the end-point of the ITK pipeline segment
> itkExporter = itk.itkVTKImageExportUS2_New()
> itkExporter.SetInput(rescaler.GetOutput())
>
> # the vtkImageImport will bring our data back into VTK-land
> vtkImporter = vtk.vtkImageImport()
> # do the magic connection call
> itk.ConnectITKUS2ToVTK(itkExporter.GetPointer(), vtkImporter)
>
> # finally write the image to disk using VTK
> writer = vtk.vtkPNGWriter()
> writer.SetFileName('maatjie.png')
> writer.SetInput(vtkImporter.GetOutput())
>
> # before we call Write() on the writer, it is prudent to give
> # our ITK pipeline an Update() call... this is not necessary
> # for normal error-less operation, but ensures that exceptions
> # thrown by ITK get through to us in the case of an error;
> # This is because the VTK wrapping system does not support
> # C++ exceptions.
> rescaler.Update()
>
> # write the file to disk...
> writer.Write()