ITK/Examples/ItkVtkGlue/itkImageToVTKImageFilter: Difference between revisions

From KitwarePublic
< ITK‎ | Examples‎ | ItkVtkGlue
Jump to navigationJump to search
(Moved QuickView into ItkVtkGlue)
(First good version)
Line 257: Line 257:
   std::vector<itk::Image<unsigned char, 2>::Pointer > Images;
   std::vector<itk::Image<unsigned char, 2>::Pointer > Images;
};
};
#endif
#endif
</source>
</source>

Revision as of 00:26, 18 November 2010

These files provide a simple mechanism to connect itk to vtk and diusplay itk images.

itkImageToVTKImageFilter.h

<source lang=cpp> /*=========================================================================

*
*  Copyright Insight Software Consortium
*
*  Licensed under the Apache License, Version 2.0 (the "License");
*  you may not use this file except in compliance with the License.
*  You may obtain a copy of the License at
*
*         http://www.apache.org/licenses/LICENSE-2.0.txt
*
*  Unless required by applicable law or agreed to in writing, software
*  distributed under the License is distributed on an "AS IS" BASIS,
*  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*  See the License for the specific language governing permissions and
*  limitations under the License.
*
*=========================================================================*/
  1. ifndef __itkImageToVTKImageFilter_h
  2. define __itkImageToVTKImageFilter_h
  1. include "itkVTKImageExport.h"
  2. include "itkFlipImageFilter.h"
  3. include "vtkImageImport.h"
  4. include "vtkImageData.h"

namespace itk {

/** \class ImageToVTKImageFilter

* \brief Converts an ITK image into a VTK image and plugs a
*  itk data pipeline to a VTK datapipeline.
*
*  This class puts together an itkVTKImageExporter and a vtkImageImporter.
*  It takes care of the details related to the connection of ITK and VTK
*  pipelines. The User will perceive this filter as an adaptor to which
*  an itk::Image can be plugged as input and a vtkImage is produced as
*  output.
*
* \ingroup   ImageFilters
*/

template <class TInputImage > class ITK_EXPORT ImageToVTKImageFilter : public ProcessObject { public:

 /** Standard class typedefs. */
 typedef ImageToVTKImageFilter       Self;
 typedef ProcessObject             Superclass;
 typedef SmartPointer<Self>        Pointer;
 typedef SmartPointer<const Self>  ConstPointer;
 /** Method for creation through the object factory. */
 itkNewMacro(Self);
 /** Run-time type information (and related methods). */
 itkTypeMacro(ImageToVTKImageFilter, ProcessObject);
 /** Some typedefs. */
 typedef TInputImage InputImageType;
 typedef typename InputImageType::ConstPointer  InputImagePointer;
 typedef VTKImageExport< InputImageType>        ExporterFilterType;
 typedef typename ExporterFilterType::Pointer   ExporterFilterPointer;
 typedef FlipImageFilter< InputImageType>       FlipFilterType;
 typedef typename FlipFilterType::Pointer       FlipFilterPointer;
 /** Get the output in the form of a vtkImage.
     This call is delegated to the internal vtkImageImporter filter  */
 vtkImageData *  GetOutput() const;
 /** Set the input in the form of an itk::Image */
 void SetInput( const InputImageType * );
 /** Return the internal VTK image importer filter.
     This is intended to facilitate users the access
     to methods in the importer */
 vtkImageImport * GetImporter() const;
 /** Return the internal ITK image exporter filter.
     This is intended to facilitate users the access
     to methods in the exporter */
 ExporterFilterType * GetExporter() const;
 /** This call delegate the update to the importer */
 void Update();

protected:

 ImageToVTKImageFilter();
 virtual ~ImageToVTKImageFilter();

private:

 ImageToVTKImageFilter(const Self&); //purposely not implemented
 void operator=(const Self&); //purposely not implemented
 ExporterFilterPointer       m_Exporter;
 FlipFilterPointer           m_Flipper;
 vtkImageImport *            m_Importer;

};

} // end namespace itk

  1. ifndef ITK_MANUAL_INSTANTIATION
  2. include "itkImageToVTKImageFilter.txx"
  3. endif
  1. endif

</source>

itkImageToVTKImageFilter.txx

<source lang=cpp> /*=========================================================================

*
*  Copyright Insight Software Consortium
*
*  Licensed under the Apache License, Version 2.0 (the "License");
*  you may not use this file except in compliance with the License.
*  You may obtain a copy of the License at
*
*         http://www.apache.org/licenses/LICENSE-2.0.txt
*
*  Unless required by applicable law or agreed to in writing, software
*  distributed under the License is distributed on an "AS IS" BASIS,
*  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*  See the License for the specific language governing permissions and
*  limitations under the License.
*
*=========================================================================*/
  1. ifndef _itkImageToVTKImageFilter_txx
  2. define _itkImageToVTKImageFilter_txx
  1. include "itkImageToVTKImageFilter.h"

namespace itk {

/**

* Constructor
*/

template <class TInputImage> ImageToVTKImageFilter<TInputImage>

ImageToVTKImageFilter()

{

 bool flipAxes[3] = { false, true, false };
 m_Importer = vtkImageImport::New();
 m_Flipper = FlipFilterType::New();
 m_Flipper->SetFlipAxes(flipAxes);
 m_Exporter = ExporterFilterType::New();
 m_Importer->SetUpdateInformationCallback(m_Exporter->GetUpdateInformationCallback());
 m_Importer->SetPipelineModifiedCallback(m_Exporter->GetPipelineModifiedCallback());
 m_Importer->SetWholeExtentCallback(m_Exporter->GetWholeExtentCallback());
 m_Importer->SetSpacingCallback(m_Exporter->GetSpacingCallback());
 m_Importer->SetOriginCallback(m_Exporter->GetOriginCallback());
 m_Importer->SetScalarTypeCallback(m_Exporter->GetScalarTypeCallback());
 m_Importer->SetNumberOfComponentsCallback(m_Exporter->GetNumberOfComponentsCallback());
 m_Importer->SetPropagateUpdateExtentCallback(m_Exporter->GetPropagateUpdateExtentCallback());
 m_Importer->SetUpdateDataCallback(m_Exporter->GetUpdateDataCallback());
 m_Importer->SetDataExtentCallback(m_Exporter->GetDataExtentCallback());
 m_Importer->SetBufferPointerCallback(m_Exporter->GetBufferPointerCallback());
 m_Importer->SetCallbackUserData(m_Exporter->GetCallbackUserData());

}

/**

* Destructor
*/

template <class TInputImage> ImageToVTKImageFilter<TInputImage>

~ImageToVTKImageFilter()

{

 if( m_Importer )
   {
   m_Importer->Delete();
   m_Importer = 0;
   }

}

/**

* Set an itk::Image as input
*/

template <class TInputImage> void ImageToVTKImageFilter<TInputImage>

SetInput( const InputImageType * inputImage )

{

 m_Flipper->SetInput( inputImage );
 m_Exporter->SetInput( m_Flipper->GetOutput() );

}

/**

* Get a vtkImage as output
*/

template <class TInputImage> vtkImageData * ImageToVTKImageFilter<TInputImage>

GetOutput() const

{

 return m_Importer->GetOutput();

}

/**

* Get the importer filter
*/

template <class TInputImage> vtkImageImport * ImageToVTKImageFilter<TInputImage>

GetImporter() const

{

 return m_Importer;

}

/**

* Get the exporter filter
*/

template <class TInputImage> typename ImageToVTKImageFilter<TInputImage>::ExporterFilterType * ImageToVTKImageFilter<TInputImage>

GetExporter() const

{

 return m_Exporter.GetPointer();

}

/**

* Delegate the Update to the importer
*/

template <class TInputImage> void ImageToVTKImageFilter<TInputImage>

Update()

{

 m_Importer->Update();

} } // end namespace itk

  1. endif

</source>

QuickView.h

<source lang="cpp">

  1. ifndef QuickView_H
  2. define QuickView_H
  1. include <vector>
  1. include <itkImage.h>

class QuickView { public:

 void AddImage(itk::Image<unsigned char, 2>::Pointer  image);
 void Visualize();

private:

 std::vector<itk::Image<unsigned char, 2>::Pointer > Images;

};

  1. endif

</source>

QuickView.cxx

<source lang="cpp">

  1. include "QuickView.h"
  1. include "itkImage.h"
  1. include "vtkImageViewer.h"
  2. include "vtkRenderWindowInteractor.h"
  3. include "vtkSmartPointer.h"
  4. include "vtkImageActor.h"
  5. include "vtkInteractorStyleImage.h"
  6. include "vtkRenderer.h"
  7. include "vtkCamera.h"
  1. include <itkImageToVTKImageFilter.h>

void QuickView::AddImage(itk::Image<unsigned char, 2>::Pointer image) {

 this->Images.push_back(image);

}

void QuickView::Visualize() {

 // Setup the render window
 vtkSmartPointer<vtkRenderWindow> renderWindow =
   vtkSmartPointer<vtkRenderWindow>::New();
 unsigned int rendererSize = 300;
 renderWindow->SetSize(rendererSize * this->Images.size(), rendererSize);
 vtkSmartPointer<vtkRenderWindowInteractor> interactor =
   vtkSmartPointer<vtkRenderWindowInteractor>::New();
 interactor->SetRenderWindow(renderWindow);
 // Render all of the images
 double step = 1./(static_cast<double>(this->Images.size()));
 std::vector<double*> viewports;
 typedef itk::ImageToVTKImageFilter<itk::Image<unsigned char, 2> > ConnectorType;
 std::vector<ConnectorType::Pointer> connectors; // Force the connectors to persist (not lose scope) after each iteration of the loop
 vtkSmartPointer<vtkCamera> camera = 
   vtkSmartPointer<vtkCamera>::New();
 for(unsigned int i = 0; i < this->Images.size(); i++)
   {
   
   ConnectorType::Pointer connector = ConnectorType::New();
   connectors.push_back(connector);
   connector->SetInput(this->Images[i]);
   connector->Update();
 
   // (xmin, ymin, xmax, ymax)
   double viewport[4] = {static_cast<double>(i)*step, 0.0, static_cast<double>(i+1)*step, 1.0};
   viewports.push_back(viewport);
   vtkSmartPointer<vtkImageActor> actor =
     vtkSmartPointer<vtkImageActor>::New();
   actor->SetInput(connector->GetOutput());
   // Setup renderer
   vtkSmartPointer<vtkRenderer> renderer =
     vtkSmartPointer<vtkRenderer>::New();
   renderWindow->AddRenderer(renderer);
   renderer->SetViewport(viewports[i]);
   renderer->SetActiveCamera(camera);
   //renderer->SetBackground(.6, .5, .4);
   renderer->AddActor(actor);
   renderer->ResetCamera();
   }
 renderWindow->Render();
 vtkSmartPointer<vtkInteractorStyleImage> style =
   vtkSmartPointer<vtkInteractorStyleImage>::New();
 interactor->SetInteractorStyle(style);
 interactor->Start();

} </source>