[Insight-users] Problem in mesh visualization with itkQuadEdgeMesh…please help!

Martine Lefevre martine_lef at yahoo.fr
Fri Feb 27 11:06:19 EST 2009


I have posted my question yesterday but nobody answer me yet, …could you please have a look on my problem and tell me how I can resolve it. Many thanks 
Hi, 
I have extracted a surface from a segmented object. The mesh is an instance of the 
QuadEdgeMesh class as I’m going to use the itkQuadEdgeMeshDiscreteGaussianCurvatureEstimator later in order to extract the curvature. 
When I visualize the extracted mesh it’s simply a black image. But if I change the type of the mesh from itkQuadEdgeMesh to itk::Mesh, it works fine and I can visualize the extracted surface. 
  
So not working with a mesh of type: 
typedef QuadEdgeMeshExtendedTraits < double, 3, 2, double, double, double, bool, bool > Traits;
typedef QuadEdgeMesh< double, 3, Traits > MeshType;
 
but working with: 
typedef itk::Mesh<double, 3,itk::DefaultStaticMeshTraits< double, 3, 3, double, double > > MeshType;
 
For the visualization I use the same procedure as in vtk2itk code. 
 
Do you have any idea about the cause of this problem? 
 
I past my code here.
Thank you 
Regards 
Martine.
 
 
//-------Surface extraction from a segmented object and mesh(the extracted surface) visualization 
 
#include "itkImageFileReader.h"
#include "itkBinaryMask3DMeshSource.h"
#include "itkImage.h"
#include "itkMesh.h"
 
#include "itkQuadEdgeMesh.h"
#include "itkVTKPolyDataReader.h"
#include "itkQuadEdgeMeshExtendedTraits.h"
#include "itkQuadEdgeMeshScalarDataVTKPolyDataWriter.h"
 
#include "itkQuadEdgeMeshDiscreteGaussianCurvatureEstimator.h"
#include "itkQuadEdgeMeshDiscreteMeanCurvatureEstimator.h"
#include "itkQuadEdgeMeshDiscreteMinCurvatureEstimator.h"
#include "itkQuadEdgeMeshDiscreteMaxCurvatureEstimator.h"
#include "itkQuadEdgeMeshScalarDataVTKPolyDataWriter.h"
 
#include <iostream>
#include "itkTriangleCell.h"
#include "itkQuadrilateralCell.h"
#include "vtkDataSetWriter.h"
#include "vtkDataSetMapper.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkActor.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkDataSetReader.h"
#include "vtkUnstructuredGrid.h"
#include "vtkDataSet.h"
#include "vtkCellArray.h"
 
using namespace itk;
 
typedef double CoordType;
typedef QuadEdgeMeshExtendedTraits < CoordType, 3,  2, CoordType, CoordType,  CoordType,  bool, bool > Traits;
typedef QuadEdgeMesh< CoordType, 3, Traits > MeshType;
//typedef itk::Mesh<double, 3,itk::DefaultStaticMeshTraits< double, 3, 3, double, double > > MeshType;
 
void Display(vtkUnstructuredGrid* itkgrid)
{
  vtkRenderer* ren1 = vtkRenderer::New();
  vtkRenderWindow* renWin = vtkRenderWindow::New();
  renWin->AddRenderer(ren1);
  vtkRenderWindowInteractor* inter = vtkRenderWindowInteractor::New();
  inter->SetRenderWindow(renWin);
 
  vtkDataSetMapper* mapper = vtkDataSetMapper::New();
  mapper->SetInput(itkgrid);
  vtkActor* actor = vtkActor::New();
  actor->SetMapper(mapper);
  ren1->AddActor(actor);
  renWin->Render();
  inter->Start();
  
  mapper->Delete();
  actor->Delete();
  ren1->Delete();
  renWin->Delete();
}
 
 
class VistVTKCellsClass
{
  vtkCellArray* m_Cells;
  int* m_LastCell;
  int* m_TypeArray;
public:
  // typedef the itk cells we are interested in
  typedef itk::CellInterface<MeshType::PixelType,MeshType::CellTraits >  CellInterfaceType;
  typedef itk::TriangleCell<CellInterfaceType>      floatTriangleCell;
  typedef itk::QuadrilateralCell<CellInterfaceType> floatQuadrilateralCell;
 
  // Set the vtkCellArray that will be constructed
  void SetCellArray(vtkCellArray* a) 
    {
      m_Cells = a;
    }
  // Set the cell counter pointer
  void SetCellCounter(int* i)
    {
      m_LastCell = i;
    }
  // Set the type array for storing the vtk cell types
  void SetTypeArray(int* i)
    {
      m_TypeArray = i;
    }
  // Visit a triangle and create the VTK_TRIANGLE cell 
  void Visit(unsigned long, floatTriangleCell* t)
    {
      m_Cells->InsertNextCell(3,  (vtkIdType*)t->PointIdsBegin());
      m_TypeArray[*m_LastCell] = VTK_TRIANGLE;
      (*m_LastCell)++;
    }
  // Visit a triangle and create the VTK_QUAD cell 
  void Visit(unsigned long, floatQuadrilateralCell* t)
    {
      m_Cells->InsertNextCell(4,  (vtkIdType*)t->PointIdsBegin());
      m_TypeArray[*m_LastCell] = VTK_QUAD;
      (*m_LastCell)++;
    }
};
  
typedef itk::CellInterfaceVisitorImplementation<vtkFloatingPointType, MeshType::CellTraits,itk::TriangleCell< itk::CellInterface<MeshType::PixelType, MeshType::CellTraits > >, 
  VistVTKCellsClass> TriangleVisitor;
 
typedef itk::CellInterfaceVisitorImplementation<vtkFloatingPointType, MeshType::CellTraits,itk::QuadrilateralCell< itk::CellInterface<MeshType::PixelType, MeshType::CellTraits > >, 
  VistVTKCellsClass> QuadrilateralVisitor;
 
vtkUnstructuredGrid* MeshToUnstructuredGrid(MeshType* mesh)
{
  // Get the number of points in the mesh
  int numPoints = mesh->GetNumberOfPoints();
  if(numPoints == 0)
    {
    mesh->Print(std::cerr);
    std::cerr << "no points in Grid " << std::endl;
    exit(-1);
    }
  // Create a vtkUnstructuredGrid
  vtkUnstructuredGrid* vgrid = vtkUnstructuredGrid::New();
 
  // Create the vtkPoints object and set the number of points
  vtkPoints* vpoints = vtkPoints::New();
  vpoints->SetNumberOfPoints(numPoints);
  // iterate over all the points in the itk mesh filling in
  // the vtkPoints object as we go
  MeshType::PointsContainer::Pointer points = mesh->GetPoints();
  for(MeshType::PointsContainer::Iterator i = points->Begin();
      i != points->End(); ++i)
    {
    // Get the point index from the point container iterator
    int idx = i->Index();
    // Set the vtk point at the index with the the coord array from itk
    // itk returns a const pointer, but vtk is not const correct, so
    // we have to use a const cast to get rid of the const
    vpoints->SetPoint(idx, const_cast<vtkFloatingPointType*>(i->Value().GetDataPointer()));
    }
  // Set the points on the vtk grid
  vgrid->SetPoints(vpoints);
  
  // Now create the cells using the MulitVisitor
  // 1. Create a MultiVisitor
  MeshType::CellType::MultiVisitor::Pointer mv = MeshType::CellType::MultiVisitor::New();
  // 2. Create a triangle and quadrilateral visitor
  TriangleVisitor::Pointer tv = TriangleVisitor::New();
  QuadrilateralVisitor::Pointer qv =  QuadrilateralVisitor::New();
  // 3. Set up the visitors
  int vtkCellCount = 0; // running counter for current cell being inserted into vtk
  int numCells = mesh->GetNumberOfCells();
  int *types = new int[numCells]; // type array for vtk 
  // create vtk cells and estimate the size
  vtkCellArray* cells = vtkCellArray::New();
  cells->EstimateSize(numCells, 4);
  // Set the TypeArray CellCount and CellArray for both visitors
  tv->SetTypeArray(types);
  tv->SetCellCounter(&vtkCellCount);
  tv->SetCellArray(cells);
  qv->SetTypeArray(types);
  qv->SetCellCounter(&vtkCellCount);
  qv->SetCellArray(cells);
  // add the visitors to the multivisitor
  mv->AddVisitor(tv);
  mv->AddVisitor(qv);
  // Now ask the mesh to accept the multivisitor which
  // will Call Visit for each cell in the mesh that matches the
  // cell types of the visitors added to the MultiVisitor
  mesh->Accept(mv);
  
  // Now set the cells on the vtk grid with the type array and cell array
  vgrid->SetCells(types, cells);
  
  // Clean up vtk objects (no vtkSmartPointer ... )
  cells->Delete();
  vpoints->Delete();
  // return the vtkUnstructuredGrid
  return vgrid;
}
 
int main(void ) 
{ 
//1---------- surface extraction from a segmented 3D object
  const unsigned int Dimension = 3;
  typedef float  PixelType; 
  typedef itk::Image< PixelType, Dimension >   ImageType;
  typedef itk::ImageFileReader< ImageType >    ReaderType;
  ReaderType::Pointer reader = ReaderType::New();
 
  typedef itk::BinaryMask3DMeshSource< ImageType, MeshType >   MeshSourceType;
  MeshSourceType::Pointer meshSource = MeshSourceType::New();
 
  reader->SetFileName("C:/Images/ConfiConnect_brainweb165a10f17_whiteMatter.hdr");  // a segmented volume
 
  try
    {
    reader->Update();
    }
  catch( itk::ExceptionObject & exp )
    {
    std::cerr << "Exception thrown while reading the input file " << std::endl;
    std::cerr << exp << std::endl;
    return EXIT_FAILURE;
    }
 
  const PixelType objectValue = static_cast<PixelType>( 255); 
  meshSource->SetObjectValue( objectValue );
  meshSource->SetInput( reader->GetOutput() );
 
 
  try
    {
    meshSource->Update();
    }
  catch( itk::ExceptionObject & exp )
    {
    std::cerr << "Exception thrown during Update() " << std::endl;
    std::cerr << exp << std::endl;
    return EXIT_FAILURE;
    }
 
  std::cout << "Nodes = " << meshSource->GetNumberOfNodes() << std::endl;
  std::cout << "Cells = " << meshSource->GetNumberOfCells() << std::endl;
  
   //2---------- Mesh (extracted surface)visualization
  vtkUnstructuredGrid* grid = MeshToUnstructuredGrid(meshSource->GetOutput()); // display the initial sphere
  Display(grid);
   
  //3----------------Curvature estimation
 
  return EXIT_SUCCESS;
}
 
 
 
 


      
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20090227/e5a58936/attachment-0001.htm>


More information about the Insight-users mailing list