[ITK-users] Problems with mesh I/O and conversions in ITK
Matt McCormick
matt.mccormick at kitware.com
Mon Apr 14 15:09:16 EDT 2014
Hi Carlos,
Ah, I see some triangle strips and normals now, thanks :-)
There should be support for NORMALS per [1], but perhaps another test
is needed. Triangle strip does not appear to be present (git grep
TRIANGLE_STRIP), but it could be added.
Thanks,
Matt
[1] http://itk.org/gitweb?p=ITK.git;a=blob;f=Modules/IO/Mesh/src/itkVTKPolyDataMeshIO.cxx;h=170fa6c2725320ca3f0c8230ec83e30ef3ef0308;hb=HEAD#l481
On Mon, Apr 14, 2014 at 2:49 PM, Carlos Henrique Villa Pinto
<chvillap at gmail.com> wrote:
> Hi Matt,
>
> As far as I could see, every model from the brain database has information
> about points, triangle strips and normals in their .vtk files. So using
> visualization tools like Paraview and Slicer, I can see the (original)
> models surfaces entirely, not just their points.
>
> However, the outputs provided by the MeshFileWriter class keep only the
> points' data, even though my program performs only a simple read-write.
>
> At first I thought this problem could be due to some incompatibility of file
> format versions, since the original models are VTK DataFiles v3.0 and ITK
> saves the outputs as v2.0. But for that other model taken from the ITK
> example, everything works fine despite this discrepancy.
>
> Thanks,
> []s
>
>
> 2014-04-14 13:41 GMT-03:00 Matt McCormick <matt.mccormick at kitware.com>:
>
>> Hi Carlos,
>>
>> When using MeshFileReader/MeshFileWriter, which cell data is being
>> lost? Examining a few of the files in the link provided at
>> nac-brain-atlas-1.0/models/ I am only seeing points.
>>
>> Thanks,
>> Matt
>>
>> On Mon, Apr 14, 2014 at 8:54 AM, Carlos Henrique Villa Pinto
>> <chvillap at gmail.com> wrote:
>> > 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
>> >
>> > _____________________________________
>> > Powered by www.kitware.com
>> >
>> > Visit other Kitware open-source projects at
>> > http://www.kitware.com/opensource/opensource.html
>> >
>> > Kitware offers ITK Training Courses, for more information visit:
>> > http://www.kitware.com/products/protraining.php
>> >
>> > Please keep messages on-topic and check the ITK FAQ at:
>> > http://www.itk.org/Wiki/ITK_FAQ
>> >
>> > Follow this link to subscribe/unsubscribe:
>> > http://www.itk.org/mailman/listinfo/insight-users
>> >
>
>
>
>
> --
> Carlos Henrique Villa Pinto
> Graduate Student in Computer Science
> Federal University of São Carlos - Brazil
> XCS
More information about the Insight-users
mailing list