[vtkusers] Rotating and Translating (for rotating and reversing sagittal and axial views) for a vtkPolyData file?
    John Drozd 
    john.drozd at gmail.com
       
    Mon May 14 15:20:46 EDT 2012
    
    
  
Hi,
I read in a .vtp file using vtkXMLPolyDataReader.
But my output is rotated when viewing the outputted Meta Image File in
Slicer3.3.6.
Is there an online reference for applying rotation and translation
transformations to a vtkPolyData file.
Below is my code: (I modified ReadPolyDataFileAndConvertToImageData.cxx):
(I apologize for the commented lines of code which I use for back referencing)
Thank you,
John
#include <vtkXMLPolyDataReader.h>
#include <vtkSmartPointer.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPolyData.h>
#include <vtkImageData.h>
#include <vtkMetaImageWriter.h>
#include <vtkPolyDataToImageStencil.h>
#include <vtkImageStencil.h>
#include <vtkPointData.h>
#include <vtkTransform.h>
#include <vtkAxesActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkImageMandelbrotSource.h>
#include <vtkImageActor.h>
#include <vtkImageMapper.h>
#include <vtkImageCast.h>
#include <vtkImageReslice.h>
#include "vtkImageToImageStencil.h"
int main ( int argc, char *argv[] )
{
  // Parse command line arguments
  if(argc != 2)
    {
    std::cerr << "Usage: " << argv[0]
              << " Filename(.vtp)" << std::endl;
    return EXIT_FAILURE;
    }
  std::string filename = argv[1];
  // Read all the data from the file
  vtkSmartPointer<vtkXMLPolyDataReader> reader =
    vtkSmartPointer<vtkXMLPolyDataReader>::New();
  reader->SetFileName(filename.c_str());
  reader->Update();
  vtkSmartPointer<vtkPolyData> pd = reader->GetOutput();
  vtkSmartPointer<vtkImageData> whiteImage =
    vtkSmartPointer<vtkImageData>::New();
  double bounds[6];
  pd->GetBounds(bounds);
  double spacing[3]; // desired volume spacing
  spacing[0] = 0.94772;
  spacing[1] = 0.94352;
  spacing[2] = 1.2021;
  whiteImage->SetSpacing(spacing);
  // compute dimensions
  int dim[3];
  for (int i = 0; i < 3; i++)
    {
    dim[i] = static_cast<int>(ceil((bounds[i * 2 + 1] - bounds[i * 2])
/ spacing[i]));
    }
  // revised dimensions
  dim[0] = 166;
  dim[1] = 256;
  dim[2] = 256;
  // end of revised dimensions
  whiteImage->SetDimensions(dim);
  //whiteImage->SetExtent(0, dim[0] - 1, 0, dim[1] - 1, 0, dim[2] - 1);
  whiteImage->SetExtent(166 - 1, 330, 0, 256 - 1, 0, 256 - 1);
  double origin[3];
  //added
  std::cout<<"bounds[0]: "<<bounds[0]<<std::endl;
  std::cout<<"bounds[2]: "<<bounds[2]<<std::endl;
  std::cout<<"bounds[4]: "<<bounds[4]<<std::endl;
  std::cout<<"spacing[0]: "<<spacing[0]<<std::endl;
  std::cout<<"spacing[1]: "<<spacing[1]<<std::endl;
  std::cout<<"spacing[2]: "<<spacing[2]<<std::endl;
  origin[0] = bounds[0] + spacing[0] / 2;
  origin[1] = bounds[2] + spacing[1] / 2;
  origin[2] = bounds[4] + spacing[2] / 2;
  std::cout<<"origin[0]: "<<origin[0]<<std::endl;
  std::cout<<"origin[1]: "<<origin[1]<<std::endl;
  std::cout<<"origin[2]: "<<origin[2]<<std::endl;
  origin[0] = -99.0-99.0-99.0+41.63-0.004;
  origin[1] = -156.31;
  origin[2] = 178.0179-62.989+0.06;
  std::cout<<"origin[0]: "<<origin[0]<<std::endl;
  std::cout<<"origin[1]: "<<origin[1]<<std::endl;
  std::cout<<"origin[2]: "<<origin[2]<<std::endl;
  whiteImage->SetOrigin(origin);
#if VTK_MAJOR_VERSION <= 5
  whiteImage->SetScalarTypeToUnsignedChar();
  whiteImage->AllocateScalars();
#else
  whiteImage->AllocateScalars(VTK_UNSIGNED_CHAR,1);
#endif
  // fill the image with foreground voxels:
  unsigned char inval = 255;
  unsigned char outval = 0;
  vtkIdType count = whiteImage->GetNumberOfPoints();
  for (vtkIdType i = 0; i < count; ++i)
    {
    whiteImage->GetPointData()->GetScalars()->SetTuple1(i, inval);
    }
  //////
  //added per vtklectureb_7.ppt
  /// Scaling along the x-axis, y-axis, z-axis as a percentage i.e.
100 = identity
  //float _sx,_sy,_sz;
  /// Skew angle in the x-y ...  plane (in degrees)
  //float _sxy, _syx,_syz,_szy,_szx,_sxz;
  /// Translation along the x-axis (in mm)
  float _tx,_ty, _tz;
  /// Rotation around the x-axis (in degrees)
  //float _rx,_ry,_rz ;
  // Additional options for mirroring of an image
  //int FlipX;
  //int FlipY;
  //int FlipZ;
  _tx = 0.0;
  _ty = 0.0;
  //tz is origin_labelmap minus origin_greyscale
  _tz = 0.0;
  // Create the transformation
  vtkSmartPointer<vtkTransform> tr =
    vtkSmartPointer<vtkTransform>::New();
  tr->PostMultiply();
  //transform1a->Translate(10.0, 0.0, 0.0);
  tr->Identity();  tr->PostMultiply();
  tr->Translate(_tx,_ty,_tz);
  float angle;
  float pi;
  pi = 4*(atan(1.0));
  angle = pi/2;
  tr->RotateZ(angle);
  //added
  tr->PostMultiply();
  vtkImageReslice* resamp=vtkImageReslice::New();
  resamp->SetInput(whiteImage);
  resamp->SetResliceTransform(tr);
  //added
  //resamp->UpDate();
  ///////
  // polygonal data --> image stencil:
  vtkSmartPointer<vtkPolyDataToImageStencil> pol2stenc =
    vtkSmartPointer<vtkPolyDataToImageStencil>::New();
  #if VTK_MAJOR_VERSION <= 5
  pol2stenc->SetInput(pd);
#else
  pol2stenc->SetInputData(pd);
#endif
  pol2stenc->SetOutputOrigin(origin);
  pol2stenc->SetOutputSpacing(spacing);
  pol2stenc->SetOutputWholeExtent(whiteImage->GetExtent());
  //whiteimage->Update();
  // cut the corresponding white image and set the background:
  vtkSmartPointer<vtkImageStencil> imgstenc =
    vtkSmartPointer<vtkImageStencil>::New();
#if VTK_MAJOR_VERSION <= 5
  imgstenc->SetInput(resamp->GetOutput());
  imgstenc->SetStencil(pol2stenc->GetOutput());
#else
  imgstenc->SetInputData(resamp->GetOutput());
  imgstenc->SetStencilConnection(pol2stenc->GetOutputPort());
#endif
  imgstenc->ReverseStencilOff();
  imgstenc->SetBackgroundValue(outval);
  imgstenc->Update();
  vtkSmartPointer<vtkMetaImageWriter> writer =
    vtkSmartPointer<vtkMetaImageWriter>::New();
  writer->SetFileName("VentricleVolumesp01vtkitkorientcorrected.mhd");
#if VTK_MAJOR_VERSION <= 5
  writer->SetInput(imgstenc->GetOutput());
#else
  writer->SetInputData(imgstenc->GetOutput());
#endif
  writer->Write();
  return EXIT_SUCCESS;
}
-- 
John Drozd, Ph.D.
Financial Secretary
Knights of Columbus
St. Pius X council 10561
Holy Family Parish
Post-Doctoral Scholar (Fellow)
Robarts Research Institute
Western University
London, ON, Canada
cell: 519-282-3340
http://publish.uwo.ca/~jdrozd2
    
    
More information about the vtkusers
mailing list