[ITK-users] Vector field not shown correctly on VTK

Jose Ignacio Prieto joseignacio.prieto at gmail.com
Mon May 12 15:50:57 EDT 2014


Hi all, I am sending this to both lists, ITK and VTK. I have trouble
loading three velocity dicom images (X, Y and Z axis). The problem is that
when displaying the vector field as a Glyph3D, the arrows are aligned only
in one axis. I have tried to check through iterators after the itk to vtk
filter and the output shows the vector is fine. Then I don't know if the
problem is in the glyph3d config or in the vtk data type. I attach all my
code if someone could give me a hand.

Thank you very much.




typedef short    ShortPixelType;
typedef itk::Image<ShortPixelType, 4> ImageType4D; // ITK Image
typedef itk::Image<ShortPixelType, 3> ImageType3D; // ITK Image
typedef itk::Image< itk::CovariantVector< ShortPixelType, 3>, 4 >
VectorImageType4D;
typedef itk::Image< itk::CovariantVector< ShortPixelType, 3>, 3 >
VectorImageType3D;
typedef itk::itkImageSeriesReader< ImageType4D>        ReaderType;
typedef itk::ImageFileWriter< VectorImageType3D>  WriterType3D;
typedef itk::ImageFileWriter< VectorImageType4D>  WriterType4D;
typedef itk::ExtractImageFilter<VectorImageType4D, VectorImageType3D>
ReductorType;
typedef itk::ImageToVTKImageFilter<VectorImageType3D>       ConnectorType;
typedef itk::ComposeImageFilter< ImageType4D, VectorImageType4D >
Vector4DComposer;
typedef itk::ImageFileReader< VectorImageType4D>  ReaderType4D;



    std::vector< ReaderType::Pointer > reader;
    std::vector< NamesGeneratorType::Pointer > nameGenerator;
    std::vector< ImageIOType::Pointer > dicomIO;
    reader.resize(3);
    nameGenerator.resize(3);
    dicomIO.resize(3);
    Vector4DComposer::Pointer vecComposer = Vector4DComposer::New();
    VectorImageType4D::Pointer m_vectorImage;

   for (int i = 0 ; i < 3 ; i++)
   {
       reader[i] = ReaderType::New();
       nameGenerator[i] = NamesGeneratorType::New();
       dicomIO[i] = ImageIOType::New();
       nameGenerator[i]->SetDirectory( argv[i + 1]);
       reader[i]->SetFileNames(nameGenerator[i]->GetInputFileNames());
       reader[i]->SetImageIO( dicomIO[i] );
       reader[i]->Update();
       vecComposer->SetInput(i,reader[i]->GetOutput());
   }

   vecComposer->UpdateLargestPossibleRegion();
   ImageType4D::SizeType size =
vecComposer->GetOutput()->GetLargestPossibleRegion().GetSize();

   int nframes =
vecComposer->GetOutput()->GetLargestPossibleRegion().GetSize()[3];
   int dim_eliminada=3;
   size[dim_eliminada]=0;
   VectorImageType4D::IndexType start =
vecComposer->GetOutput()->GetLargestPossibleRegion().GetIndex();
   start[dim_eliminada] = 30;
   VectorImageType4D::RegionType desiredRegion;
   desiredRegion.SetSize(  size  );
   desiredRegion.SetIndex( start );

   ReductorType::Pointer reductor = ReductorType::New();
   reductor->InPlaceOn();
   reductor->SetDirectionCollapseToSubmatrix();
   reductor->SetExtractionRegion( desiredRegion );
   reductor->SetInput(vecComposer->GetOutput());
   reductor->Update();


   ConnectorType::Pointer m_connector = ConnectorType::New();
   m_connector->SetInput(reductor->GetOutput());
   m_connector->UpdateLargestPossibleRegion();
   m_connector->Update();

  std::cout << "image start " << std::endl;
   for (int i = 0; i < m_connector->GetOutput()->GetDimensions()[0]; i++)
   {
       for (int j = 0; j < m_connector->GetOutput()->GetDimensions()[1];
j++)
       {
           for (int k = 0; k <
m_connector->GetOutput()->GetDimensions()[2]; k++)
           {
               myfile<< "On point " << "i, j, k: " << i<<", "<< j<<", "<<
k<<
                        " Component 0: "<<
m_connector->GetOutput()->GetScalarComponentAsDouble(i, j, k, 0) <<
                        " Component 1: "<<
m_connector->GetOutput()->GetScalarComponentAsDouble(i, j, k, 1) <<
                        " Component 2: "<<
m_connector->GetOutput()->GetScalarComponentAsDouble(i, j, k, 2) <<
                         "\n";
           }
       }
   }

   vtkSmartPointer< vtkImageDataGeometryFilter > vtkConverter =
vtkSmartPointer< vtkImageDataGeometryFilter >::New();
   vtkConverter->SetInput(m_connector->GetOutput());
   vtkConverter->UpdateWholeExtent();

   vtkSmartPointer< vtkArrowSource > m_arrows = vtkSmartPointer<
vtkArrowSource >::New();
   m_arrows->SetTipLength(.1);
   m_arrows->SetTipResolution(5);
   m_arrows->SetTipRadius(.05);
   m_arrows->SetShaftResolution(5);
   m_arrows->SetShaftRadius(.015);
   m_arrows->Update();

   vtkSmartPointer< vtkGlyph3D > m_glyphs = vtkSmartPointer< vtkGlyph3D
>::New();
//   m_glyphs->SetSourceConnection(m_connector->GetOutput());
//   m_glyphs->SetInput(m_connector->GetOutput());
//   m_glyphs->SetInputConnection(m_connector->GetOutput() ());
   m_glyphs->SetInputConnection(vtkConverter->GetOutputPort());
//   m_glyphs->SetSource(m_arrows->GetOutput());
   m_glyphs->SetSourceConnection(m_arrows->GetOutputPort());
   m_glyphs->OrientOn();
//   m_glyphs->OrientOff();
//   m_glyphs->SetVectorModeToVectorRotationOff();
   m_glyphs->SetVectorModeToUseVector();
//   m_glyphs->SetVectorModeToUseNormal();
//   m_glyphs->SetScaleModeToDataScalingOn();
//   m_glyphs->SetScaleModeToDataScalingOff();
//   m_glyphs->SetColorModeToColorByVector();
//   m_glyphs->SetScaleModeToScaleByVector();
//   m_glyphs->SetColorModeToColorByScalar();
   m_glyphs->SetColorModeToColorByScale();
   m_glyphs->SetScaleFactor(0.2);
//   m_glyphs->SetIndexModeToVector();
//   m_glyphs->SetScaleModeToDataScalingOff();
//   m_glyphs->SetScaleFactor(.5);
   m_glyphs->Update();

   vtkSmartPointer< vtkOpenGLPolyDataMapper > glyphPolyData =
vtkSmartPointer< vtkOpenGLPolyDataMapper >::New();
   glyphPolyData->SetInputConnection(m_glyphs->GetOutputPort());
   vtkSmartPointer< vtkOpenGLActor > glyphActor = vtkSmartPointer<
vtkOpenGLActor >::New();
   glyphActor->SetMapper(glyphPolyData);

   vtkSmartPointer< vtkWin32OpenGLRenderWindow >  renWin = vtkSmartPointer<
vtkWin32OpenGLRenderWindow>::New();

   vtkSmartPointer< vtkOpenGLRenderer>  ren1 = vtkSmartPointer<
vtkOpenGLRenderer> ::New();
   renWin->AddRenderer(ren1);
   ren1->AddActor(glyphActor);

   vtkSmartPointer< vtkRenderWindowInteractor > rwi = vtkSmartPointer<
vtkRenderWindowInteractor >::New();
   vtkSmartPointer<MouseInteractorStyle> styleActor =
vtkSmartPointer<MouseInteractorStyle>::New();
   rwi->SetInteractorStyle(styleActor);

   rwi->SetRenderWindow(renWin);
   rwi->SetSize(640, 480);
   rwi->Initialize();
   renWin->Render();
   rwi->Start();


-- 
José Ignacio Prieto
Software developer
Biomedical Imaging Center
Pontificia Universidad Catolica de Chile
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20140512/801909fe/attachment.html>


More information about the Insight-users mailing list