[ITK-users] Problems with mesh I/O and conversions in ITK

Carlos Henrique Villa Pinto chvillap at gmail.com
Mon Apr 14 08:54:32 EDT 2014


Hi everyone!
I'm having some problems working with meshes in ITK.

What I'm trying to do (by now) is just a brief test in which I read a .vtk
mesh file from this database:
http://www.spl.harvard.edu/publications/item/view/2037, write it again to
the disk and see if everything is ok. Very simple.

The problem is: if I try to do that using the itk::MeshReader and
itk::MeshWriter classes, the program doesn't work as expected since the
written mesh apparently loses all information about the original mesh's
cells (I'm using Paraview and Slicer for visualization). The same thing
happens if I use the itk::VTKPolyDataReader and itk::VTKPolyDataWriter
classes for the mesh I/O. However, if I do the same test reading the .vtk
mesh file provided by this example:
http://itk.org/ITKExamples/src/IO/Mesh/ReadMesh/Documentation.html,
everything works fine in both cases. So I guess it could be a file format
issue.

I also tried to use VTK instead of ITK for the mesh I/O (the
vtkPolyDataReader and vtkPolyDataWriter classes). And with that, the
program works fine even with the meshes from the brain database. But as I
intend to work with deformable models algorithms in ITK, that approach
requires me to convert the read vtkPolyData into a ITK simplex mesh, but
such conversion makes my program crash (either an exception is thrown
because of an invalid point or the program enters in an infinite loop). I'm
using the vtkPolyDataToitkMesh class (from InsightApplications) to convert
the VTK polydata to a ITK triangle mesh, and the
itk::TriangleMeshToSimplexMeshFilter class to convert the latter to a
simplex mesh.

Last, but not least: if I just do the following conversions: VTK polydata
-> ITK triangle mesh -> VTK polydata and try to write the resulting
polydata (using vtkPolyDataWriter), I get a segmentation fault. No clue
about what causes it.

The more recent and complete version of my code (VTK + ITK) is below. If
anyone could help me with any of these issues, I would be very grateful.

=============================================================================================

  // Set the ITK type definitions.

  const int Dimension = 3;
  typedef double PixelType;

  typedef vtkPolyDataToitkMesh::TriangleMeshType
              TriangleMeshType;
  typedef itk::DefaultDynamicMeshTraits<PixelType, Dimension, Dimension,
double, double> SimplexMeshTraits;
  typedef itk::SimplexMesh<PixelType, Dimension, SimplexMeshTraits>
             SimplexMeshType;

  typedef itk::TriangleMeshToSimplexMeshFilter<TriangleMeshType,
SimplexMeshType> TriangleToSimplexFilterType;
  typedef itk::SimplexMeshToTriangleMeshFilter<SimplexMeshType,
TriangleMeshType> SimplexToTriangleFilterType;

  typedef itk::SimplexMeshVolumeCalculator<SimplexMeshType>
VolumeCalculatorType;

  typedef itk::VTKPolyDataWriter<TriangleMeshType> WriterType;

  // Read the input VTK polydata.

  vtkSmartPointer<vtkPolyDataReader> reader =
vtkSmartPointer<vtkPolyDataReader>::New();
  reader->SetFileName(inputFileName.c_str());
  reader->Update();

  std::cout << "Polydata read ok\n";

  // Convert the VTK polydata to a ITK mesh.

  vtkPolyDataToitkMesh polyDataToMesh;
  polyDataToMesh.SetInput(reader->GetOutput());
  polyDataToMesh.ConvertvtkToitk();

  std::cout << "Conversion to triangle mesh ok\n";

  // Convert the triangle mesh to a simplex mesh.

  TriangleToSimplexFilterType::Pointer triangleToSimplexFilter =
TriangleToSimplexFilterType::New();
  triangleToSimplexFilter->SetInput(polyDataToMesh.GetOutput());
  triangleToSimplexFilter->Update();

  std::cout << "Conversion to simplex mesh ok\n";

  // Compute the simplex mesh volume.

  VolumeCalculatorType::Pointer volumeCalculator =
VolumeCalculatorType::New();
  volumeCalculator->SetSimplexMesh(triangleToSimplexFilter->GetOutput());
  volumeCalculator->Compute();

  std::cout << "Volume calculation ok (value = " <<
volumeCalculator->GetVolume() << ")\n";

  // Convert the simplex mesh to triangle mesh.

  SimplexToTriangleFilterType::Pointer simplexToTriangleFilter =
SimplexToTriangleFilterType::New();
  simplexToTriangleFilter->SetInput(triangleToSimplexFilter->GetOutput());
  simplexToTriangleFilter->Update();

  std::cout << "Conversion to triangle mesh ok\n";

  // Convert the ITK mesh to VTK polydata.

  itkMeshTovtkPolyData meshToPolyData;
  meshToPolyData.SetInput(simplexToTriangleFilter->GetOutput());
  meshToPolyData.ConvertitkTovtk();

  std::cout << "Conversion to polydata ok\n";

  // Write the output polydata.

  vtkSmartPointer<vtkPolyDataWriter> writer =
vtkSmartPointer<vtkPolyDataWriter>::New();
  writer->SetFileName(outputFileName.c_str());
  writer->SetInputData(meshToPolyData.GetOutput());
  writer->Update();

  std::cout << "Polydata write ok\n";

=============================================================================================

Thanks in advance.
[]s

-- 
Carlos Henrique Villa Pinto
Graduate Student in Computer Science
Federal University of São Carlos - Brazil
XCS
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20140414/d6f59469/attachment.html>


More information about the Insight-users mailing list