ITK/Examples/ItkVtkGlue/itkImageToVTKImageFilter: Difference between revisions
(Remove export modifiers) |
|||
(15 intermediate revisions by the same user not shown) | |||
Line 44: | Line 44: | ||
*/ | */ | ||
template <class TInputImage > | template <class TInputImage > | ||
class | class ImageToVTKImageFilter : public ProcessObject | ||
{ | { | ||
public: | public: | ||
Line 71: | Line 71: | ||
/** Set the input in the form of an itk::Image */ | /** Set the input in the form of an itk::Image */ | ||
using Superclass::SetInput; | |||
void SetInput( const InputImageType * ); | void SetInput( const InputImageType * ); | ||
Line 234: | Line 235: | ||
==QuickView.h== | ==QuickView.h== | ||
<source lang="cpp"> | <source lang="cpp"> | ||
#ifndef | /*========================================================================= | ||
#define | * | ||
* 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 QuickView_h | |||
#define QuickView_h | |||
#include <vector> | #include <vector> | ||
#include <algorithm> | |||
#include <string> | |||
#include <itkImage.h> | #include <itkImage.h> | ||
#include <itkRGBPixel.h> | #include <itkRGBPixel.h> | ||
#include <itkIntTypes.h> | |||
class ImageInfo | /** \class ImageInfo | ||
* \brief A container for an image and its descriptiom | |||
* \ingroup ITKVtkGlue | |||
*/ | |||
class ImageInfo | |||
{ | { | ||
public: | public: | ||
Line 257: | Line 282: | ||
}; | }; | ||
class RGBImageInfo | /** \class RGBImageInfo | ||
* \brief A container for an rgb image and its descriptiom | |||
* \ingroup ITKVtkGlue | |||
*/ | |||
class RGBImageInfo | |||
{ | { | ||
public: | public: | ||
Line 271: | Line 300: | ||
}; | }; | ||
class QuickView | /** \class QuickView | ||
* \brief A convenient class to render itk images with vtk | |||
* | |||
* This class presents a convenient and efficient mechanism to display | |||
* ITK images in VTK render windows. | |||
* | |||
* The AddImage and AddRGBImage methods collect ITK images to be | |||
* rendered in a collection of VTK RenderWindow's. Each image can | |||
* be flipped about the vertical axis. An optional description will be | |||
* displayed at the bottom of each render window. | |||
* | |||
* If m_ShareCamera is true, a single <a href="http://www.vtk.org/doc/nightly/html/classvtkCamera.html">vtkCamera</a> | |||
* will be used for each render window (default is false). | |||
* | |||
* Each image is rescaled to have a range between 0 and 255. Currently, the size | |||
* of each render window is fixed at 300,300 and the text size for descriptions | |||
* is fixed at 10. | |||
* | |||
* The Visualize method displays the render windows and starts a | |||
* <a href="http://www.vtk.org/doc/nightly/html/classvtkInteractorStyleImage.html">vtkInteractorStyleImage</a>. | |||
* The layout and background color of each render window is fixed. The optional | |||
* boolean for the constructor, if false, bypasses the interactor. This is useful | |||
* for running tests. | |||
* | |||
* Typical usage: | |||
* | |||
* \code | |||
* QuickView viewer; | |||
* viewer.AddImage(someFilter->GetOutput(). | |||
* true (to flip image) or false. | |||
* "text to display with the image"); | |||
* | |||
* viewer.AddRGBImage(someFilter->GetOutput(). | |||
* true (to flip image) or false. | |||
* "text to display with the image"); | |||
* \endcode | |||
* | |||
* \ingroup ITKVtkGlue | |||
*/ | |||
class QuickView | |||
{ | { | ||
public: | public: | ||
template< | QuickView() | ||
{ | |||
m_ShareCamera = true; | |||
m_Interpolate = true; | |||
m_Counter = 0; | |||
m_Snapshot = false; | |||
m_SnapshotPath = ""; | |||
m_SnapshotPrefix = "snapshot_"; | |||
m_SnapshotExtension = "png"; | |||
m_NumberOfColumns = 4; | |||
m_ViewPortSize = 300; | |||
} | |||
/** Add an image to be rendered. */ | |||
template<typename TImage> void AddImage( | |||
TImage *, | TImage *, | ||
bool FlipVertical=true, | bool FlipVertical=true, | ||
std::string Description=""); | std::string Description=""); | ||
template< | |||
/** Add an RGB image to be rendered */ | |||
template<typename TImage> void AddRGBImage( | |||
TImage *, | TImage *, | ||
bool FlipVertical=true, | bool FlipVertical=true, | ||
std::string Description=""); | std::string Description=""); | ||
void Visualize(); | |||
/** Render the images. If interact is tru, start a vtk | |||
* Interactor. If false, return after one render. | |||
*/ | |||
void Visualize(bool interact=true); | |||
/** Each render window will have its own camera */ | |||
void ShareCameraOff() | |||
{ | |||
m_ShareCamera = false; | |||
} | |||
/** Each render window will use the same camera */ | |||
void ShareCameraOn() | |||
{ | |||
m_ShareCamera = true; | |||
} | |||
/** Use pixel replication in rendered image */ | |||
void InterpolateOff() | |||
{ | |||
m_Interpolate = false; | |||
} | |||
/** Use pixel interpolation in rendered image */ | |||
void InterpolateOn() | |||
{ | |||
m_Interpolate = true; | |||
} | |||
/** Each render window will take a snaphot */ | |||
void SnapshotOn() | |||
{ | |||
m_Snapshot = true; | |||
} | |||
/** Each render window will take a snaphot */ | |||
void SnapshotOff() | |||
{ | |||
m_Snapshot = false; | |||
} | |||
void SetSnapshotPath( const std::string& iPath ) | |||
{ | |||
m_SnapshotPath = iPath; | |||
} | |||
void SetSnapshotPrefix( const std::string& iPrefix ) | |||
{ | |||
m_SnapshotPrefix = iPrefix; | |||
} | |||
/** Provide the image format to be used when taking snapshot */ | |||
void SetSnapshotExtension( const std::string& iExtension ) | |||
{ | |||
m_SnapshotExtension = iExtension; | |||
std::transform( | |||
m_SnapshotExtension.begin(), | |||
m_SnapshotExtension.end(), | |||
m_SnapshotExtension.begin(), | |||
::tolower ); | |||
} | |||
/** Set the number of columns, default 4.*/ | |||
void SetNumberOfColumns (const unsigned int columns) | |||
{ | |||
m_NumberOfColumns = columns; | |||
} | |||
/** Set the viewport size, default 300.*/ | |||
void SetViewPortSize (const unsigned int size) | |||
{ | |||
m_ViewPortSize = size; | |||
} | |||
private: | private: | ||
std::vector<ImageInfo> Images; | std::vector<ImageInfo> Images; // Container for images | ||
std::vector<RGBImageInfo> RGBImages; | std::vector<RGBImageInfo> RGBImages; // Container for rgb images | ||
itk::IdentifierType m_Counter; | |||
std::string m_SnapshotPath; | |||
std::string m_SnapshotPrefix; | |||
std::string m_SnapshotExtension; | |||
bool m_ShareCamera; | |||
bool m_Snapshot; | |||
bool m_Interpolate; | |||
unsigned int m_NumberOfColumns; | |||
unsigned int m_ViewPortSize; | |||
}; | }; | ||
Line 295: | Line 460: | ||
==QuickView.cxx== | ==QuickView.cxx== | ||
<source lang="cpp"> | <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. | |||
* | |||
*=========================================================================*/ | |||
#include "QuickView.h" | #include "QuickView.h" | ||
#include "itkRescaleIntensityImageFilter.h" | #include "itkRescaleIntensityImageFilter.h" | ||
#include "itkVectorRescaleIntensityImageFilter.h" | |||
#include "itkRGBToVectorImageAdaptor.h" | |||
#include "itkFlipImageFilter.h" | #include "itkFlipImageFilter.h" | ||
#include " | #include "vtkVersion.h" | ||
#include "vtkRenderWindowInteractor.h" | #include "vtkRenderWindowInteractor.h" | ||
#include " | #include "vtkImageMapper3D.h" | ||
#include "vtkImageActor.h" | #include "vtkImageActor.h" | ||
#include "vtkActor2D.h" | #include "vtkActor2D.h" | ||
Line 312: | Line 495: | ||
#include "vtkTextProperty.h" | #include "vtkTextProperty.h" | ||
#include "vtkTextMapper.h" | #include "vtkTextMapper.h" | ||
#include "vtkCaptureScreen.h" | |||
#include "vtkPNGWriter.h" | |||
#include "vtkJPEGWriter.h" | |||
#include "vtkBMPWriter.h" | |||
#include "vtkTIFFWriter.h" | |||
#include "itkImageToVTKImageFilter.h" | #include "itkImageToVTKImageFilter.h" | ||
typedef itk::Image<itk::RGBPixel<unsigned char>, 2> | |||
typedef itk::Image<itk::RGBPixel<float>, 2> | 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<unsigned char, 2> UnsignedCharImageType; | ||
Line 330: | Line 519: | ||
typedef itk::Image<double, 2> DoubleImageType; | typedef itk::Image<double, 2> DoubleImageType; | ||
template void QuickView::AddImage<CharImageType>(CharImageType *image, bool FlipVertical, std::string Description); | template void QuickView::AddImage<CharImageType>( | ||
template void QuickView::AddImage<UnsignedShortImageType>(UnsignedShortImageType *image, bool FlipVertical, std::string Description); | CharImageType *image, | ||
template void QuickView::AddImage<ShortImageType>(ShortImageType *image, bool FlipVertical, std::string Description); | bool FlipVertical, | ||
template void QuickView::AddImage<UnsignedIntImageType>(UnsignedIntImageType *image, bool FlipVertical, std::string Description); | std::string Description); | ||
template void QuickView::AddImage<IntImageType>(IntImageType *image, bool FlipVertical, std::string Description); | template void QuickView::AddImage<UnsignedShortImageType>( | ||
template void QuickView::AddImage<UnsignedLongImageType>(UnsignedLongImageType *image, bool FlipVertical, std::string Description); | UnsignedShortImageType *image, | ||
template void QuickView::AddImage<LongImageType>(LongImageType *image, bool FlipVertical, std::string Description); | bool FlipVertical, | ||
template void QuickView::AddImage<FloatImageType>(FloatImageType *image, bool FlipVertical, std::string Description); | std::string Description); | ||
template void QuickView::AddImage<DoubleImageType>(DoubleImageType *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< > | template< > | ||
Line 365: | Line 581: | ||
} | } | ||
template< | template<typename TImage> | ||
void QuickView::AddImage( | void QuickView::AddImage( | ||
TImage *image, | TImage *image, | ||
Line 371: | Line 587: | ||
std::string Description) | std::string Description) | ||
{ | { | ||
typedef itk::RescaleIntensityImageFilter<TImage, UnsignedCharImageType > rescaleFilterType; | typedef itk::RescaleIntensityImageFilter<TImage, UnsignedCharImageType > | ||
rescaleFilterType; | |||
typename rescaleFilterType::Pointer rescaler = rescaleFilterType::New(); | typename rescaleFilterType::Pointer rescaler = rescaleFilterType::New(); | ||
Line 378: | Line 595: | ||
rescaler->SetInput(image); | rescaler->SetInput(image); | ||
rescaler->Update(); | rescaler->Update(); | ||
this->AddImage(rescaler->GetOutput(), FlipVertical, Description); | this->AddImage(rescaler->GetOutput(), FlipVertical, Description); | ||
} | |||
template< > | |||
void QuickView::AddImage<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(), Description); | |||
this->RGBImages.push_back(myImage); | |||
} | |||
else | |||
{ | |||
RGBImageInfo myImage(image, Description); | |||
this->RGBImages.push_back(myImage); | |||
} | |||
} | } | ||
Line 397: | Line 639: | ||
flipper->SetInput(image); | flipper->SetInput(image); | ||
flipper->Update(); | flipper->Update(); | ||
RGBImageInfo myImage(flipper->GetOutput()); | RGBImageInfo myImage(flipper->GetOutput(), Description); | ||
this->RGBImages.push_back(myImage); | this->RGBImages.push_back(myImage); | ||
} | } | ||
else | else | ||
{ | { | ||
RGBImageInfo myImage(image); | RGBImageInfo myImage(image, Description); | ||
this->RGBImages.push_back(myImage); | this->RGBImages.push_back(myImage); | ||
} | } | ||
} | } | ||
void QuickView::Visualize() | template< > | ||
void QuickView::AddRGBImage<FloatRGBImageType>( | |||
FloatRGBImageType *image, | |||
bool FlipVertical, | |||
std::string Description) | |||
{ | |||
typedef itk::RGBToVectorImageAdaptor<FloatRGBImageType> AdaptorType; | |||
AdaptorType::Pointer adaptor = AdaptorType::New(); | |||
adaptor->SetImage(image); | |||
typedef itk::VectorRescaleIntensityImageFilter<AdaptorType, UnsignedCharRGBImageType > rescaleFilterType; | |||
rescaleFilterType::Pointer rescaler = rescaleFilterType::New(); | |||
rescaler->SetOutputMaximumMagnitude(255); | |||
rescaler->SetInput(adaptor); | |||
rescaler->Update(); | |||
this->AddRGBImage(rescaler->GetOutput(), FlipVertical, Description); | |||
} | |||
template< > | |||
void QuickView::AddImage<FloatRGBImageType>( | |||
FloatRGBImageType *image, | |||
bool FlipVertical, | |||
std::string Description) | |||
{ | |||
typedef itk::RGBToVectorImageAdaptor<FloatRGBImageType> AdaptorType; | |||
AdaptorType::Pointer adaptor = AdaptorType::New(); | |||
adaptor->SetImage(image); | |||
typedef itk::VectorRescaleIntensityImageFilter<AdaptorType, UnsignedCharRGBImageType > rescaleFilterType; | |||
rescaleFilterType::Pointer rescaler = rescaleFilterType::New(); | |||
rescaler->SetOutputMaximumMagnitude(255); | |||
rescaler->SetInput(adaptor); | |||
rescaler->Update(); | |||
this->AddRGBImage(rescaler->GetOutput(), FlipVertical, Description); | |||
} | |||
void QuickView::Visualize(bool interact) | |||
{ | { | ||
unsigned int rendererSize = | unsigned int rendererSize = this->m_ViewPortSize; | ||
unsigned int numberOfImages = this->Images.size() + this->RGBImages.size(); | unsigned int numberOfImages = this->Images.size() + this->RGBImages.size(); | ||
unsigned int numberOfRows = (numberOfImages - 1) / this->m_NumberOfColumns + 1; | |||
unsigned int numberOfColumns = numberOfImages / (numberOfRows) + 1; | |||
if (numberOfColumns > numberOfImages) | |||
{ | |||
numberOfColumns = numberOfImages; | |||
} | |||
// Setup the render window and interactor | // Setup the render window and interactor | ||
vtkSmartPointer<vtkRenderWindow> renderWindow = | vtkSmartPointer<vtkRenderWindow> renderWindow = | ||
vtkSmartPointer<vtkRenderWindow>::New(); | vtkSmartPointer<vtkRenderWindow>::New(); | ||
renderWindow->SetSize(rendererSize * | renderWindow->SetSize(rendererSize * numberOfColumns, | ||
rendererSize * numberOfRows); | |||
vtkSmartPointer<vtkRenderWindowInteractor> interactor = | vtkSmartPointer<vtkRenderWindowInteractor> interactor = | ||
Line 421: | Line 707: | ||
// Render all of the images | // Render all of the images | ||
std::vector<double*> viewports; | std::vector<double*> viewports; | ||
Line 428: | Line 713: | ||
typedef itk::ImageToVTKImageFilter<itk::Image<itk::RGBPixel<unsigned char>, 2> > | typedef itk::ImageToVTKImageFilter<itk::Image<itk::RGBPixel<unsigned char>, 2> > | ||
RGBConnectorType; | 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> | 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}; | ||
vtkSmartPointer<vtkCamera> sharedCamera = | vtkSmartPointer<vtkCamera> sharedCamera = | ||
vtkSmartPointer<vtkCamera>::New(); | vtkSmartPointer<vtkCamera>::New(); | ||
for(unsigned int | for(unsigned int row = 0; row < numberOfRows; ++row) | ||
{ | { | ||
for(unsigned int col = 0; col < numberOfColumns; ++col) | |||
{ | |||
size_t i = row * numberOfColumns + col; | |||
// (xmin, ymin, xmax, ymax) | |||
double viewport[4] = | |||
{static_cast<double>(col) * rendererSize / (numberOfColumns * rendererSize), | |||
static_cast<double>(numberOfRows - (row+1)) * rendererSize / (numberOfRows * rendererSize), | |||
static_cast<double>(col+1)*rendererSize / (numberOfColumns * rendererSize), | |||
static_cast<double>(numberOfRows - row) * rendererSize / (numberOfRows * rendererSize)}; | |||
viewports.push_back(viewport); | |||
// Grayscale images | |||
if (i < this->Images.size()) | |||
{ | |||
ConnectorType::Pointer connector = ConnectorType::New(); | |||
connectors.push_back(connector); | |||
connector->SetInput(this->Images[i].m_Image); | |||
vtkSmartPointer<vtkImageActor> actor = | |||
vtkSmartPointer<vtkImageActor>::New(); | |||
vtkSmartPointer<vtkRenderer>::New(); | #if VTK_MAJOR_VERSION <= 5 | ||
actor->SetInput(connector->GetOutput()); | |||
#else | |||
connector->Update(); | |||
actor->GetMapper()->SetInputData(connector->GetOutput()); | |||
#endif | |||
// Setup renderer | |||
vtkSmartPointer<vtkRenderer> renderer = | |||
vtkSmartPointer<vtkRenderer>::New(); | |||
renderWindow->AddRenderer(renderer); | |||
renderer->SetViewport(viewports[i]); | |||
renderer->SetBackground(background); | |||
if (m_ShareCamera) | |||
{ | |||
renderer->SetActiveCamera(sharedCamera); | |||
} | |||
else | |||
{ | |||
vtkSmartPointer<vtkCamera> aCamera = | |||
vtkSmartPointer<vtkCamera>::New(); | |||
renderer->SetActiveCamera(aCamera); | |||
} | |||
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); | |||
} | |||
if (m_Interpolate) | |||
{ | |||
actor->InterpolateOn(); | |||
} | |||
else | |||
{ | |||
actor->InterpolateOff(); | |||
} | |||
renderer->AddActor(actor); | |||
renderer->ResetCamera(); | |||
} | |||
// RGB Images | |||
else if (i >= this->Images.size() && i < numberOfImages) | |||
{ | |||
unsigned int j = row * numberOfColumns + col - this->Images.size(); | |||
RGBConnectorType::Pointer connector = RGBConnectorType::New(); | |||
RGBconnectors.push_back(connector); | |||
connector->SetInput(this->RGBImages[j].m_Image); | |||
vtkSmartPointer<vtkImageActor> actor = | |||
vtkSmartPointer<vtkImageActor>::New(); | |||
#if VTK_MAJOR_VERSION <= 5 | |||
actor->SetInput(connector->GetOutput()); | |||
#else | |||
connector->Update(); | |||
actor->GetMapper()->SetInputData(connector->GetOutput()); | |||
#endif | |||
// Setup renderer | |||
vtkSmartPointer<vtkRenderer> renderer = | |||
vtkSmartPointer<vtkRenderer>::New(); | |||
renderWindow->AddRenderer(renderer); | |||
renderer->SetViewport(viewports[i]); | |||
renderer->SetBackground(background); | |||
if (m_ShareCamera) | |||
{ | |||
renderer->SetActiveCamera(sharedCamera); | |||
} | |||
else | |||
{ | |||
vtkSmartPointer<vtkCamera> aCamera = | |||
vtkSmartPointer<vtkCamera>::New(); | |||
renderer->SetActiveCamera(aCamera); | |||
} | |||
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); | |||
} | |||
if (m_Interpolate) | |||
{ | |||
actor->InterpolateOn(); | |||
} | |||
else | |||
{ | |||
actor->InterpolateOff(); | |||
} | |||
renderer->AddActor(actor); | |||
renderer->ResetCamera(); | |||
} | |||
else | |||
{ | |||
// Fill empty viewports | |||
vtkSmartPointer<vtkRenderer> renderer = | |||
vtkSmartPointer<vtkRenderer>::New(); | |||
renderWindow->AddRenderer(renderer); | |||
renderer->SetViewport(viewports[i]); | |||
renderer->SetBackground(background); | |||
continue; | |||
} | |||
} | } | ||
} | } | ||
renderWindow->Render(); | |||
if( m_Snapshot ) | |||
{ | { | ||
std::string filename; | |||
std::stringstream temp; | |||
temp << m_SnapshotPath << m_SnapshotPrefix << m_Counter << "."; | |||
filename = temp.str(); | |||
filename.append( m_SnapshotExtension ); | |||
if( m_SnapshotExtension == "png" ) | |||
{ | |||
{ | vtkCaptureScreen< vtkPNGWriter > capture( renderWindow ); | ||
capture( filename ); | |||
} | |||
if( ( m_SnapshotExtension == "jpg" ) || ( m_SnapshotExtension == "jpeg" ) ) | |||
{ | { | ||
vtkCaptureScreen< vtkJPEGWriter > capture( renderWindow ); | |||
capture( filename ); | |||
} | } | ||
if( m_SnapshotExtension == "bmp" ) | |||
{ | { | ||
vtkCaptureScreen< vtkBMPWriter > capture( renderWindow ); | |||
capture( filename ); | |||
} | } | ||
if( ( m_SnapshotExtension == "tif" ) || ( m_SnapshotExtension == "tiff" ) ) | |||
{ | { | ||
vtkCaptureScreen< vtkTIFFWriter > capture( renderWindow ); | |||
capture( filename ); | |||
} | } | ||
m_Counter++; | |||
} | } | ||
vtkSmartPointer<vtkInteractorStyleImage> style = | vtkSmartPointer<vtkInteractorStyleImage> style = | ||
vtkSmartPointer<vtkInteractorStyleImage>::New(); | vtkSmartPointer<vtkInteractorStyleImage>::New(); | ||
interactor->SetInteractorStyle(style); | interactor->SetInteractorStyle(style); | ||
interactor->Start(); | |||
if (interact) | |||
{ | |||
interactor->Start(); | |||
} | |||
} | } | ||
</source> | |||
==vtkCaptureScreen.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 __vtkCaptureScreen_h | |||
#define __vtkCaptureScreen_h | |||
#include <string> | |||
#include "vtkSmartPointer.h" | |||
#include "vtkWindowToImageFilter.h" | |||
#include "vtkRenderWindow.h" | |||
template < class TImageWriter > | |||
class vtkCaptureScreen | |||
{ | |||
public: | |||
typedef TImageWriter ImageWriterType; | |||
vtkCaptureScreen( vtkRenderWindow* iRenderer ) : m_Renderer ( iRenderer ) | |||
{} | |||
vtkCaptureScreen() : m_Renderer( NULL ) | |||
{} | |||
~vtkCaptureScreen( ) | |||
{} | |||
void operator( ) ( const std::string& iFileName ) const | |||
{ | |||
Capture( m_Renderer, iFileName ); | |||
} | |||
void operator( ) ( vtkRenderWindow* iRenderer, | |||
const std::string& iFileName ) const | |||
{ | |||
m_Renderer = iRenderer; | |||
Capture( m_Renderer, iFileName ); | |||
} | |||
private: | |||
vtkCaptureScreen ( const vtkCaptureScreen& ); | |||
void operator = ( const vtkCaptureScreen& ); | |||
vtkRenderWindow* m_Renderer; | |||
void Capture( vtkRenderWindow* iRenderer, | |||
const std::string& iFileName ) const | |||
{ | |||
if( iRenderer ) | |||
{ | |||
vtkSmartPointer< vtkWindowToImageFilter > Dumper = | |||
vtkSmartPointer< vtkWindowToImageFilter >::New( ); | |||
Dumper->SetInput( iRenderer ); | |||
Dumper->Update( ); | |||
vtkSmartPointer< ImageWriterType > writer = | |||
vtkSmartPointer< ImageWriterType >::New( ); | |||
writer->SetFileName ( iFileName.c_str( ) ); | |||
writer->SetInputConnection ( Dumper->GetOutputPort( ) ); | |||
writer->Write( ); | |||
} | |||
} | |||
}; | |||
#endif | |||
</source> | </source> |
Latest revision as of 15:58, 30 September 2015
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 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 */ using Superclass::SetInput; 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"> /*=========================================================================
* * 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 QuickView_h
- define QuickView_h
- include <vector>
- include <algorithm>
- include <string>
- include <itkImage.h>
- include <itkRGBPixel.h>
- include <itkIntTypes.h>
/** \class ImageInfo
* \brief A container for an image and its descriptiom * \ingroup ITKVtkGlue */
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
* \brief A container for an rgb image and its descriptiom * \ingroup ITKVtkGlue */
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
* \brief A convenient class to render itk images with vtk * * This class presents a convenient and efficient mechanism to display * ITK images in VTK render windows. * * The AddImage and AddRGBImage methods collect ITK images to be * rendered in a collection of VTK RenderWindow's. Each image can * be flipped about the vertical axis. An optional description will be * displayed at the bottom of each render window. * * If m_ShareCamera is true, a single <a href="http://www.vtk.org/doc/nightly/html/classvtkCamera.html">vtkCamera</a> * will be used for each render window (default is false). * * Each image is rescaled to have a range between 0 and 255. Currently, the size * of each render window is fixed at 300,300 and the text size for descriptions * is fixed at 10. * * The Visualize method displays the render windows and starts a * <a href="http://www.vtk.org/doc/nightly/html/classvtkInteractorStyleImage.html">vtkInteractorStyleImage</a>. * The layout and background color of each render window is fixed. The optional * boolean for the constructor, if false, bypasses the interactor. This is useful * for running tests. * * Typical usage: * * \code * QuickView viewer; * viewer.AddImage(someFilter->GetOutput(). * true (to flip image) or false. * "text to display with the image"); * * viewer.AddRGBImage(someFilter->GetOutput(). * true (to flip image) or false. * "text to display with the image"); * \endcode * * \ingroup ITKVtkGlue */
class QuickView { public:
QuickView() { m_ShareCamera = true; m_Interpolate = true; m_Counter = 0; m_Snapshot = false; m_SnapshotPath = ""; m_SnapshotPrefix = "snapshot_"; m_SnapshotExtension = "png"; m_NumberOfColumns = 4; m_ViewPortSize = 300; } /** Add an image to be rendered. */ template<typename TImage> void AddImage( TImage *, bool FlipVertical=true, std::string Description="");
/** Add an RGB image to be rendered */ template<typename TImage> void AddRGBImage( TImage *, bool FlipVertical=true, std::string Description="");
/** Render the images. If interact is tru, start a vtk * Interactor. If false, return after one render. */ void Visualize(bool interact=true);
/** Each render window will have its own camera */ void ShareCameraOff() { m_ShareCamera = false; }
/** Each render window will use the same camera */ void ShareCameraOn() { m_ShareCamera = true; }
/** Use pixel replication in rendered image */ void InterpolateOff() { m_Interpolate = false; }
/** Use pixel interpolation in rendered image */ void InterpolateOn() { m_Interpolate = true; }
/** Each render window will take a snaphot */ void SnapshotOn() { m_Snapshot = true; }
/** Each render window will take a snaphot */ void SnapshotOff() { m_Snapshot = false; }
void SetSnapshotPath( const std::string& iPath ) { m_SnapshotPath = iPath; }
void SetSnapshotPrefix( const std::string& iPrefix ) { m_SnapshotPrefix = iPrefix; }
/** Provide the image format to be used when taking snapshot */ void SetSnapshotExtension( const std::string& iExtension ) { m_SnapshotExtension = iExtension; std::transform( m_SnapshotExtension.begin(), m_SnapshotExtension.end(), m_SnapshotExtension.begin(), ::tolower ); }
/** Set the number of columns, default 4.*/ void SetNumberOfColumns (const unsigned int columns) { m_NumberOfColumns = columns; }
/** Set the viewport size, default 300.*/ void SetViewPortSize (const unsigned int size) { m_ViewPortSize = size; }
private:
std::vector<ImageInfo> Images; // Container for images std::vector<RGBImageInfo> RGBImages; // Container for rgb images itk::IdentifierType m_Counter; std::string m_SnapshotPath; std::string m_SnapshotPrefix; std::string m_SnapshotExtension; bool m_ShareCamera; bool m_Snapshot; bool m_Interpolate; unsigned int m_NumberOfColumns; unsigned int m_ViewPortSize;
};
- endif
</source>
QuickView.cxx
<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. * *=========================================================================*/
- include "QuickView.h"
- include "itkRescaleIntensityImageFilter.h"
- include "itkVectorRescaleIntensityImageFilter.h"
- include "itkRGBToVectorImageAdaptor.h"
- include "itkFlipImageFilter.h"
- include "vtkVersion.h"
- include "vtkRenderWindowInteractor.h"
- include "vtkImageMapper3D.h"
- include "vtkImageActor.h"
- include "vtkActor2D.h"
- include "vtkInteractorStyleImage.h"
- include "vtkRenderer.h"
- include "vtkCamera.h"
- include "vtkTextProperty.h"
- include "vtkTextMapper.h"
- include "vtkCaptureScreen.h"
- include "vtkPNGWriter.h"
- include "vtkJPEGWriter.h"
- include "vtkBMPWriter.h"
- include "vtkTIFFWriter.h"
- include "itkImageToVTKImageFilter.h"
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<typename 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::AddImage<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(), Description); this->RGBImages.push_back(myImage); } else { RGBImageInfo myImage(image, Description); this->RGBImages.push_back(myImage); }
}
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(), Description); this->RGBImages.push_back(myImage); } else { RGBImageInfo myImage(image, Description); this->RGBImages.push_back(myImage); }
}
template< > void QuickView::AddRGBImage<FloatRGBImageType>(
FloatRGBImageType *image, bool FlipVertical, std::string Description)
{
typedef itk::RGBToVectorImageAdaptor<FloatRGBImageType> AdaptorType; AdaptorType::Pointer adaptor = AdaptorType::New(); adaptor->SetImage(image);
typedef itk::VectorRescaleIntensityImageFilter<AdaptorType, UnsignedCharRGBImageType > rescaleFilterType; rescaleFilterType::Pointer rescaler = rescaleFilterType::New(); rescaler->SetOutputMaximumMagnitude(255); rescaler->SetInput(adaptor); rescaler->Update(); this->AddRGBImage(rescaler->GetOutput(), FlipVertical, Description);
}
template< > void QuickView::AddImage<FloatRGBImageType>(
FloatRGBImageType *image, bool FlipVertical, std::string Description)
{
typedef itk::RGBToVectorImageAdaptor<FloatRGBImageType> AdaptorType; AdaptorType::Pointer adaptor = AdaptorType::New(); adaptor->SetImage(image);
typedef itk::VectorRescaleIntensityImageFilter<AdaptorType, UnsignedCharRGBImageType > rescaleFilterType; rescaleFilterType::Pointer rescaler = rescaleFilterType::New(); rescaler->SetOutputMaximumMagnitude(255); rescaler->SetInput(adaptor); rescaler->Update(); this->AddRGBImage(rescaler->GetOutput(), FlipVertical, Description);
}
void QuickView::Visualize(bool interact) {
unsigned int rendererSize = this->m_ViewPortSize; unsigned int numberOfImages = this->Images.size() + this->RGBImages.size(); unsigned int numberOfRows = (numberOfImages - 1) / this->m_NumberOfColumns + 1; unsigned int numberOfColumns = numberOfImages / (numberOfRows) + 1; if (numberOfColumns > numberOfImages) { numberOfColumns = numberOfImages; }
// Setup the render window and interactor vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->SetSize(rendererSize * numberOfColumns, rendererSize * numberOfRows);
vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); interactor->SetRenderWindow(renderWindow);
// Render all of the images 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> sharedCamera = vtkSmartPointer<vtkCamera>::New();
for(unsigned int row = 0; row < numberOfRows; ++row) { for(unsigned int col = 0; col < numberOfColumns; ++col) { size_t i = row * numberOfColumns + col; // (xmin, ymin, xmax, ymax) double viewport[4] = {static_cast<double>(col) * rendererSize / (numberOfColumns * rendererSize), static_cast<double>(numberOfRows - (row+1)) * rendererSize / (numberOfRows * rendererSize), static_cast<double>(col+1)*rendererSize / (numberOfColumns * rendererSize), static_cast<double>(numberOfRows - row) * rendererSize / (numberOfRows * rendererSize)}; viewports.push_back(viewport);
// Grayscale images if (i < this->Images.size()) { ConnectorType::Pointer connector = ConnectorType::New(); connectors.push_back(connector); connector->SetInput(this->Images[i].m_Image);
vtkSmartPointer<vtkImageActor> actor = vtkSmartPointer<vtkImageActor>::New();
- if VTK_MAJOR_VERSION <= 5
actor->SetInput(connector->GetOutput());
- else
connector->Update(); actor->GetMapper()->SetInputData(connector->GetOutput());
- endif
// Setup renderer vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); renderWindow->AddRenderer(renderer); renderer->SetViewport(viewports[i]); renderer->SetBackground(background); if (m_ShareCamera) { renderer->SetActiveCamera(sharedCamera); } else { vtkSmartPointer<vtkCamera> aCamera = vtkSmartPointer<vtkCamera>::New(); renderer->SetActiveCamera(aCamera); } 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); } if (m_Interpolate) { actor->InterpolateOn(); } else { actor->InterpolateOff(); } renderer->AddActor(actor); renderer->ResetCamera(); } // RGB Images else if (i >= this->Images.size() && i < numberOfImages) { unsigned int j = row * numberOfColumns + col - this->Images.size(); RGBConnectorType::Pointer connector = RGBConnectorType::New(); RGBconnectors.push_back(connector); connector->SetInput(this->RGBImages[j].m_Image);
vtkSmartPointer<vtkImageActor> actor = vtkSmartPointer<vtkImageActor>::New();
- if VTK_MAJOR_VERSION <= 5
actor->SetInput(connector->GetOutput());
- else
connector->Update(); actor->GetMapper()->SetInputData(connector->GetOutput());
- endif
// Setup renderer vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); renderWindow->AddRenderer(renderer); renderer->SetViewport(viewports[i]); renderer->SetBackground(background); if (m_ShareCamera) { renderer->SetActiveCamera(sharedCamera); } else { vtkSmartPointer<vtkCamera> aCamera = vtkSmartPointer<vtkCamera>::New(); renderer->SetActiveCamera(aCamera); } 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); }
if (m_Interpolate) { actor->InterpolateOn(); } else { actor->InterpolateOff(); } renderer->AddActor(actor); renderer->ResetCamera(); } else { // Fill empty viewports vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); renderWindow->AddRenderer(renderer); renderer->SetViewport(viewports[i]); renderer->SetBackground(background); continue; } } } renderWindow->Render();
if( m_Snapshot ) { std::string filename; std::stringstream temp; temp << m_SnapshotPath << m_SnapshotPrefix << m_Counter << "."; filename = temp.str(); filename.append( m_SnapshotExtension );
if( m_SnapshotExtension == "png" ) { vtkCaptureScreen< vtkPNGWriter > capture( renderWindow ); capture( filename ); } if( ( m_SnapshotExtension == "jpg" ) || ( m_SnapshotExtension == "jpeg" ) ) { vtkCaptureScreen< vtkJPEGWriter > capture( renderWindow ); capture( filename ); } if( m_SnapshotExtension == "bmp" ) { vtkCaptureScreen< vtkBMPWriter > capture( renderWindow ); capture( filename ); } if( ( m_SnapshotExtension == "tif" ) || ( m_SnapshotExtension == "tiff" ) ) { vtkCaptureScreen< vtkTIFFWriter > capture( renderWindow ); capture( filename ); } m_Counter++; }
vtkSmartPointer<vtkInteractorStyleImage> style = vtkSmartPointer<vtkInteractorStyleImage>::New(); interactor->SetInteractorStyle(style);
if (interact) { interactor->Start(); }
} </source>
vtkCaptureScreen.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 __vtkCaptureScreen_h
- define __vtkCaptureScreen_h
- include <string>
- include "vtkSmartPointer.h"
- include "vtkWindowToImageFilter.h"
- include "vtkRenderWindow.h"
template < class TImageWriter > class vtkCaptureScreen
{
public:
typedef TImageWriter ImageWriterType;
vtkCaptureScreen( vtkRenderWindow* iRenderer ) : m_Renderer ( iRenderer ) {}
vtkCaptureScreen() : m_Renderer( NULL ) {}
~vtkCaptureScreen( ) {}
void operator( ) ( const std::string& iFileName ) const { Capture( m_Renderer, iFileName ); }
void operator( ) ( vtkRenderWindow* iRenderer, const std::string& iFileName ) const { m_Renderer = iRenderer; Capture( m_Renderer, iFileName ); }
private: vtkCaptureScreen ( const vtkCaptureScreen& ); void operator = ( const vtkCaptureScreen& );
vtkRenderWindow* m_Renderer;
void Capture( vtkRenderWindow* iRenderer, const std::string& iFileName ) const { if( iRenderer ) { vtkSmartPointer< vtkWindowToImageFilter > Dumper = vtkSmartPointer< vtkWindowToImageFilter >::New( ); Dumper->SetInput( iRenderer ); Dumper->Update( );
vtkSmartPointer< ImageWriterType > writer = vtkSmartPointer< ImageWriterType >::New( ); writer->SetFileName ( iFileName.c_str( ) ); writer->SetInputConnection ( Dumper->GetOutputPort( ) ); writer->Write( ); } } };
- endif
</source>