ITK/Examples/ItkVtkGlue/itkImageToVTKImageFilter: Difference between revisions
(Added Description.) |
(Added Description.) |
||
Line 298: | Line 298: | ||
#include "itkImage.h" | #include "itkImage.h" | ||
#include "itkRGBPixel.h" | |||
#include "itkRescaleIntensityImageFilter.h" | #include "itkRescaleIntensityImageFilter.h" | ||
#include "itkFlipImageFilter.h" | #include "itkFlipImageFilter.h" | ||
Line 305: | Line 306: | ||
#include "vtkSmartPointer.h" | #include "vtkSmartPointer.h" | ||
#include "vtkImageActor.h" | #include "vtkImageActor.h" | ||
#include "vtkActor2D.h" | |||
#include "vtkInteractorStyleImage.h" | #include "vtkInteractorStyleImage.h" | ||
#include "vtkRenderer.h" | #include "vtkRenderer.h" | ||
#include "vtkCamera.h" | #include "vtkCamera.h" | ||
#include "vtkTextProperty.h" | |||
#include "vtkTextMapper.h" | |||
#include "itkImageToVTKImageFilter.h" | #include "itkImageToVTKImageFilter.h" | ||
Line 326: | Line 330: | ||
typedef itk::Image<double, 2> DoubleImageType; | typedef itk::Image<double, 2> DoubleImageType; | ||
template void QuickView::AddImage<CharImageType>(CharImageType *image, bool FlipVertical); | template void QuickView::AddImage<CharImageType>(CharImageType *image, bool FlipVertical, std::string Description); | ||
template void QuickView::AddImage<UnsignedShortImageType>(UnsignedShortImageType *image, bool FlipVertical); | template void QuickView::AddImage<UnsignedShortImageType>(UnsignedShortImageType *image, bool FlipVertical, std::string Description); | ||
template void QuickView::AddImage<ShortImageType>(ShortImageType *image, bool FlipVertical); | template void QuickView::AddImage<ShortImageType>(ShortImageType *image, bool FlipVertical, std::string Description); | ||
template void QuickView::AddImage<UnsignedIntImageType>(UnsignedIntImageType *image, bool FlipVertical); | template void QuickView::AddImage<UnsignedIntImageType>(UnsignedIntImageType *image, bool FlipVertical, std::string Description); | ||
template void QuickView::AddImage<IntImageType>(IntImageType *image, bool FlipVertical); | template void QuickView::AddImage<IntImageType>(IntImageType *image, bool FlipVertical, std::string Description); | ||
template void QuickView::AddImage<UnsignedLongImageType>(UnsignedLongImageType *image, bool FlipVertical); | template void QuickView::AddImage<UnsignedLongImageType>(UnsignedLongImageType *image, bool FlipVertical, std::string Description); | ||
template void QuickView::AddImage<LongImageType>(LongImageType *image, bool FlipVertical); | template void QuickView::AddImage<LongImageType>(LongImageType *image, bool FlipVertical, std::string Description); | ||
template void QuickView::AddImage<FloatImageType>(FloatImageType *image, bool FlipVertical); | template void QuickView::AddImage<FloatImageType>(FloatImageType *image, bool FlipVertical, std::string Description); | ||
template void QuickView::AddImage<DoubleImageType>(DoubleImageType *image, bool FlipVertical); | template void QuickView::AddImage<DoubleImageType>(DoubleImageType *image, bool FlipVertical, std::string Description); | ||
template< > | template< > | ||
void QuickView::AddImage<UnsignedCharImageType>(UnsignedCharImageType *image, bool FlipVertical) | void QuickView::AddImage<UnsignedCharImageType>( | ||
UnsignedCharImageType *image, | |||
bool FlipVertical, | |||
std::string Description) | |||
{ | { | ||
if (FlipVertical) | if (FlipVertical) | ||
Line 348: | Line 355: | ||
flipper->SetInput(image); | flipper->SetInput(image); | ||
flipper->Update(); | flipper->Update(); | ||
this->Images.push_back( | ImageInfo myImage(flipper->GetOutput(), Description); | ||
this->Images.push_back(myImage); | |||
} | } | ||
else | else | ||
{ | { | ||
this->Images.push_back( | ImageInfo myImage(image, Description); | ||
this->Images.push_back(myImage); | |||
} | } | ||
} | } | ||
template<class TImage> | template<class TImage> | ||
void QuickView::AddImage(TImage *image, bool FlipVertical) | void QuickView::AddImage( | ||
TImage *image, | |||
bool FlipVertical, | |||
std::string Description) | |||
{ | { | ||
typedef itk::RescaleIntensityImageFilter<TImage, UnsignedCharImageType > rescaleFilterType; | typedef itk::RescaleIntensityImageFilter<TImage, UnsignedCharImageType > rescaleFilterType; | ||
Line 367: | Line 379: | ||
rescaler->Update(); | rescaler->Update(); | ||
this->AddImage(rescaler->GetOutput(), FlipVertical); | this->AddImage(rescaler->GetOutput(), FlipVertical, Description); | ||
} | } | ||
template< > | template< > | ||
void QuickView::AddRGBImage<UnsignedCharRGBImageType>(UnsignedCharRGBImageType *image, bool FlipVertical) | void QuickView::AddRGBImage<UnsignedCharRGBImageType>( | ||
UnsignedCharRGBImageType *image, | |||
bool FlipVertical, | |||
std::string Description) | |||
{ | { | ||
if (FlipVertical) | if (FlipVertical) | ||
Line 382: | Line 397: | ||
flipper->SetInput(image); | flipper->SetInput(image); | ||
flipper->Update(); | flipper->Update(); | ||
this->RGBImages.push_back( | RGBImageInfo myImage(flipper->GetOutput()); | ||
this->RGBImages.push_back(myImage); | |||
} | } | ||
else | else | ||
{ | { | ||
this->RGBImages.push_back( | RGBImageInfo myImage(image); | ||
this->RGBImages.push_back(myImage); | |||
} | } | ||
} | } | ||
Line 392: | Line 409: | ||
void QuickView::Visualize() | void QuickView::Visualize() | ||
{ | { | ||
// Setup the render window | unsigned int rendererSize = 300; | ||
// Setup the render window and interactor | |||
vtkSmartPointer<vtkRenderWindow> renderWindow = | vtkSmartPointer<vtkRenderWindow> renderWindow = | ||
vtkSmartPointer<vtkRenderWindow>::New(); | vtkSmartPointer<vtkRenderWindow>::New(); | ||
renderWindow->SetSize(rendererSize * this->Images.size(), rendererSize); | renderWindow->SetSize(rendererSize * this->Images.size(), rendererSize); | ||
Line 406: | Line 424: | ||
std::vector<double*> viewports; | std::vector<double*> viewports; | ||
typedef itk::ImageToVTKImageFilter<itk::Image<unsigned char, 2> > ConnectorType; | typedef itk::ImageToVTKImageFilter<itk::Image<unsigned char, 2> > | ||
typedef itk::ImageToVTKImageFilter<itk::Image<itk::RGBPixel<unsigned char>, 2> > RGBConnectorType; | ConnectorType; | ||
typedef itk::ImageToVTKImageFilter<itk::Image<itk::RGBPixel<unsigned char>, 2> > | |||
RGBConnectorType; | |||
std::vector<ConnectorType::Pointer> connectors; // Force the connectors to persist (not lose scope) after each iteration of the loop | std::vector<ConnectorType::Pointer> connectors; // Force the connectors to persist (not lose scope) after each iteration of the loop | ||
std::vector<RGBConnectorType::Pointer> RGBconnectors; // Force the connectors to persist | std::vector<RGBConnectorType::Pointer> | ||
RGBconnectors; // Force the connectors to persist after each iteration of the loop | |||
double background[6] = {.4, .5, .6, .6, .5, .4}; | double background[6] = {.4, .5, .6, .6, .5, .4}; | ||
Line 420: | Line 441: | ||
ConnectorType::Pointer connector = ConnectorType::New(); | ConnectorType::Pointer connector = ConnectorType::New(); | ||
connectors.push_back(connector); | connectors.push_back(connector); | ||
connector->SetInput(this->Images[i]); | connector->SetInput(this->Images[i].m_Image); | ||
// (xmin, ymin, xmax, ymax) | // (xmin, ymin, xmax, ymax) | ||
Line 437: | Line 458: | ||
renderer->SetActiveCamera(camera); | renderer->SetActiveCamera(camera); | ||
std::rotate(background, background + 1, background + 6); | std::rotate(background, background + 1, background + 6); | ||
if (this->Images[i].m_Description != "") | |||
{ | |||
vtkSmartPointer<vtkTextProperty> textProperty = | |||
vtkSmartPointer<vtkTextProperty>::New(); | |||
textProperty->SetFontSize(10); | |||
textProperty->SetFontFamilyToCourier(); | |||
textProperty->SetJustificationToCentered(); | |||
vtkSmartPointer<vtkTextMapper> textMapper = | |||
vtkSmartPointer<vtkTextMapper>::New(); | |||
textMapper->SetTextProperty(textProperty); | |||
textMapper->SetInput(this->Images[i].m_Description.c_str()); | |||
vtkSmartPointer<vtkActor2D> textActor = | |||
vtkSmartPointer<vtkActor2D>::New(); | |||
textActor->SetMapper(textMapper); | |||
textActor->SetPosition(rendererSize/2, 16); | |||
renderer->AddActor(textActor); | |||
} | |||
renderer->AddActor(actor); | renderer->AddActor(actor); | ||
Line 442: | Line 483: | ||
} | } | ||
for(unsigned int i = | unsigned int j = 0; | ||
for(unsigned int i = this->Images.size(); i < this->RGBImages.size(); i++, j++) | |||
{ | { | ||
RGBConnectorType::Pointer connector = RGBConnectorType::New(); | RGBConnectorType::Pointer connector = RGBConnectorType::New(); | ||
RGBconnectors.push_back(connector); | RGBconnectors.push_back(connector); | ||
connector->SetInput(this->RGBImages[ | connector->SetInput(this->RGBImages[j].m_Image); | ||
// (xmin, ymin, xmax, ymax) | // (xmin, ymin, xmax, ymax) | ||
double viewport[4] = {static_cast<double>(i)*step, 0.0, static_cast<double>(i+1)*step, 1.0}; | double viewport[4] = | ||
{static_cast<double>(i)*step, 0.0, static_cast<double>(i+1)*step, 1.0}; | |||
viewports.push_back(viewport); | viewports.push_back(viewport); | ||
vtkSmartPointer<vtkImageActor> actor = | vtkSmartPointer<vtkImageActor> actor = | ||
Line 459: | Line 502: | ||
vtkSmartPointer<vtkRenderer>::New(); | vtkSmartPointer<vtkRenderer>::New(); | ||
renderWindow->AddRenderer(renderer); | renderWindow->AddRenderer(renderer); | ||
renderer->SetViewport(viewports[ | renderer->SetViewport(viewports[j]); | ||
renderer->SetBackground(background); | renderer->SetBackground(background); | ||
renderer->SetActiveCamera(camera); | renderer->SetActiveCamera(camera); | ||
std::rotate(background, background + 1, background + 6); | std::rotate(background, background + 1, background + 6); | ||
if (this->RGBImages[j].m_Description != "") | |||
{ | |||
vtkSmartPointer<vtkTextProperty> textProperty = | |||
vtkSmartPointer<vtkTextProperty>::New(); | |||
textProperty->SetFontSize(10); | |||
textProperty->SetFontFamilyToCourier(); | |||
textProperty->SetJustificationToCentered(); | |||
vtkSmartPointer<vtkTextMapper> textMapper = | |||
vtkSmartPointer<vtkTextMapper>::New(); | |||
textMapper->SetTextProperty(textProperty); | |||
textMapper->SetInput(this->RGBImages[j].m_Description.c_str()); | |||
vtkSmartPointer<vtkActor2D> textActor = | |||
vtkSmartPointer<vtkActor2D>::New(); | |||
textActor->SetMapper(textMapper); | |||
textActor->SetPosition(rendererSize/2, 16); | |||
renderer->AddActor(textActor); | |||
} | |||
renderer->AddActor(actor); | renderer->AddActor(actor); |
Revision as of 00:28, 17 December 2010
Many of the ITK examples use VTK to display the results. The files on this page provide a simple interface between ITK and VTK.
NOTE: If you download the entire ITK Wiki Examples Collection,, the ItkVtkGlue directory will be included. If you wish to just build a few examples, then you will need to download ItkVtkGlue and build it.
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. * *=========================================================================*/
- ifndef __itkImageToVTKImageFilter_h
- define __itkImageToVTKImageFilter_h
- include "itkVTKImageExport.h"
- include "vtkImageImport.h"
- 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;
/** 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; vtkImageImport * m_Importer;
};
} // end namespace itk
- ifndef ITK_MANUAL_INSTANTIATION
- include "itkImageToVTKImageFilter.txx"
- endif
- 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. * *=========================================================================*/
- ifndef _itkImageToVTKImageFilter_txx
- define _itkImageToVTKImageFilter_txx
- include "itkImageToVTKImageFilter.h"
namespace itk {
/**
* Constructor */
template <class TInputImage> ImageToVTKImageFilter<TInputImage>
- ImageToVTKImageFilter()
{
m_Importer = vtkImageImport::New(); 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_Exporter->SetInput( inputImage );
}
/**
* 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
- endif
</source>
QuickView.h
<source lang="cpp">
- ifndef QuickView_H
- define QuickView_H
- include <vector>
- include <itkImage.h>
- include <itkRGBPixel.h>
class ImageInfo { public:
typedef itk::Image<unsigned char, 2> ImageType;
ImageInfo(ImageType *image, std::string description="") { m_Image = image; m_Description = description; }
ImageType::Pointer m_Image; std::string m_Description;
};
class RGBImageInfo { public:
typedef itk::Image<itk::RGBPixel<unsigned char>, 2> ImageType; RGBImageInfo(ImageType *image, std::string description="") { m_Image = image; m_Description = description; }
ImageType::Pointer m_Image; std::string m_Description;
};
class QuickView {
public:
template<class TImage> void AddImage( TImage *, bool FlipVertical=true, std::string Description=""); template<class TImage> void AddRGBImage( TImage *, bool FlipVertical=true, std::string Description=""); void Visualize();
private:
std::vector<ImageInfo> Images; std::vector<RGBImageInfo> RGBImages;
};
- endif
</source>
QuickView.cxx
<source lang="cpp">
- include "QuickView.h"
- include "itkImage.h"
- include "itkRGBPixel.h"
- include "itkRescaleIntensityImageFilter.h"
- include "itkFlipImageFilter.h"
- include "vtkImageViewer.h"
- include "vtkRenderWindowInteractor.h"
- include "vtkSmartPointer.h"
- include "vtkImageActor.h"
- include "vtkActor2D.h"
- include "vtkInteractorStyleImage.h"
- include "vtkRenderer.h"
- include "vtkCamera.h"
- include "vtkTextProperty.h"
- include "vtkTextMapper.h"
- include "itkImageToVTKImageFilter.h"
- include <algorithm>
typedef itk::Image<itk::RGBPixel<unsigned char>, 2> UnsignedCharRGBImageType; typedef itk::Image<itk::RGBPixel<float>, 2> FloatRGBImageType;
typedef itk::Image<unsigned char, 2> UnsignedCharImageType; typedef itk::Image<char, 2> CharImageType; typedef itk::Image<unsigned short, 2> UnsignedShortImageType; typedef itk::Image<short, 2> ShortImageType; typedef itk::Image<unsigned int, 2> UnsignedIntImageType; typedef itk::Image<int, 2> IntImageType; typedef itk::Image<unsigned long, 2> UnsignedLongImageType; typedef itk::Image<long, 2> LongImageType; typedef itk::Image<float, 2> FloatImageType; typedef itk::Image<double, 2> DoubleImageType;
template void QuickView::AddImage<CharImageType>(CharImageType *image, bool FlipVertical, std::string Description); template void QuickView::AddImage<UnsignedShortImageType>(UnsignedShortImageType *image, bool FlipVertical, std::string Description); template void QuickView::AddImage<ShortImageType>(ShortImageType *image, bool FlipVertical, std::string Description); template void QuickView::AddImage<UnsignedIntImageType>(UnsignedIntImageType *image, bool FlipVertical, std::string Description); template void QuickView::AddImage<IntImageType>(IntImageType *image, bool FlipVertical, std::string Description); template void QuickView::AddImage<UnsignedLongImageType>(UnsignedLongImageType *image, bool FlipVertical, std::string Description); template void QuickView::AddImage<LongImageType>(LongImageType *image, bool FlipVertical, std::string Description); template void QuickView::AddImage<FloatImageType>(FloatImageType *image, bool FlipVertical, std::string Description); template void QuickView::AddImage<DoubleImageType>(DoubleImageType *image, bool FlipVertical, std::string Description);
template< > void QuickView::AddImage<UnsignedCharImageType>(
UnsignedCharImageType *image, bool FlipVertical, std::string Description)
{
if (FlipVertical) { typedef itk::FlipImageFilter< UnsignedCharImageType> FlipFilterType; FlipFilterType::Pointer flipper = FlipFilterType::New(); bool flipAxes[3] = { false, true, false }; flipper = FlipFilterType::New(); flipper->SetFlipAxes(flipAxes); flipper->SetInput(image); flipper->Update(); ImageInfo myImage(flipper->GetOutput(), Description); this->Images.push_back(myImage); } else { ImageInfo myImage(image, Description); this->Images.push_back(myImage); }
}
template<class TImage> void QuickView::AddImage(
TImage *image, bool FlipVertical, std::string Description)
{
typedef itk::RescaleIntensityImageFilter<TImage, UnsignedCharImageType > rescaleFilterType;
typename rescaleFilterType::Pointer rescaler = rescaleFilterType::New(); rescaler->SetOutputMinimum(0); rescaler->SetOutputMaximum(255); rescaler->SetInput(image); rescaler->Update(); this->AddImage(rescaler->GetOutput(), FlipVertical, Description);
}
template< > void QuickView::AddRGBImage<UnsignedCharRGBImageType>(
UnsignedCharRGBImageType *image, bool FlipVertical, std::string Description)
{
if (FlipVertical) { typedef itk::FlipImageFilter< UnsignedCharRGBImageType> FlipFilterType; FlipFilterType::Pointer flipper = FlipFilterType::New(); bool flipAxes[3] = { false, true, false }; flipper = FlipFilterType::New(); flipper->SetFlipAxes(flipAxes); flipper->SetInput(image); flipper->Update(); RGBImageInfo myImage(flipper->GetOutput()); this->RGBImages.push_back(myImage); } else { RGBImageInfo myImage(image); this->RGBImages.push_back(myImage); }
}
void QuickView::Visualize() {
unsigned int rendererSize = 300;
// Setup the render window and interactor vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); 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()+this->RGBImages.size())); std::vector<double*> viewports;
typedef itk::ImageToVTKImageFilter<itk::Image<unsigned char, 2> > ConnectorType; typedef itk::ImageToVTKImageFilter<itk::Image<itk::RGBPixel<unsigned char>, 2> > RGBConnectorType; std::vector<ConnectorType::Pointer> connectors; // Force the connectors to persist (not lose scope) after each iteration of the loop std::vector<RGBConnectorType::Pointer> RGBconnectors; // Force the connectors to persist after each iteration of the loop
double background[6] = {.4, .5, .6, .6, .5, .4};
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].m_Image); // (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->SetBackground(background); renderer->SetActiveCamera(camera); std::rotate(background, background + 1, background + 6);
if (this->Images[i].m_Description != "") { vtkSmartPointer<vtkTextProperty> textProperty = vtkSmartPointer<vtkTextProperty>::New(); textProperty->SetFontSize(10); textProperty->SetFontFamilyToCourier(); textProperty->SetJustificationToCentered();
vtkSmartPointer<vtkTextMapper> textMapper = vtkSmartPointer<vtkTextMapper>::New(); textMapper->SetTextProperty(textProperty); textMapper->SetInput(this->Images[i].m_Description.c_str()); vtkSmartPointer<vtkActor2D> textActor = vtkSmartPointer<vtkActor2D>::New(); textActor->SetMapper(textMapper); textActor->SetPosition(rendererSize/2, 16); renderer->AddActor(textActor); }
renderer->AddActor(actor); renderer->ResetCamera(); }
unsigned int j = 0; for(unsigned int i = this->Images.size(); i < this->RGBImages.size(); i++, j++) { RGBConnectorType::Pointer connector = RGBConnectorType::New(); RGBconnectors.push_back(connector); connector->SetInput(this->RGBImages[j].m_Image);
// (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[j]); renderer->SetBackground(background); renderer->SetActiveCamera(camera); std::rotate(background, background + 1, background + 6);
if (this->RGBImages[j].m_Description != "") { vtkSmartPointer<vtkTextProperty> textProperty = vtkSmartPointer<vtkTextProperty>::New(); textProperty->SetFontSize(10); textProperty->SetFontFamilyToCourier(); textProperty->SetJustificationToCentered();
vtkSmartPointer<vtkTextMapper> textMapper = vtkSmartPointer<vtkTextMapper>::New(); textMapper->SetTextProperty(textProperty); textMapper->SetInput(this->RGBImages[j].m_Description.c_str()); vtkSmartPointer<vtkActor2D> textActor = vtkSmartPointer<vtkActor2D>::New(); textActor->SetMapper(textMapper); textActor->SetPosition(rendererSize/2, 16); renderer->AddActor(textActor); }
renderer->AddActor(actor); renderer->ResetCamera(); }
renderWindow->Render();
vtkSmartPointer<vtkInteractorStyleImage> style = vtkSmartPointer<vtkInteractorStyleImage>::New(); interactor->SetInteractorStyle(style); interactor->Start();
} </source>