[vtkusers] avoiding/removing non-manifold parts from the result of vtkMarchingCubes

Bill Lorensen bill.lorensen at gmail.com
Fri Aug 2 16:30:30 EDT 2013


Great. I generated a surface. It will take be a few minutes to generate
feature edges.



On Fri, Aug 2, 2013 at 4:25 PM, Dr. Roman Grothausmann <
grothausmann.roman at mh-hannover.de> wrote:

> On 02/08/13 22:20, Bill Lorensen wrote:
>
>> what level do you use?
>>
>
> Sorry, forgot to mention that: level 127
>
>
>>
>>
>> On Fri, Aug 2, 2013 at 4:07 PM, Dr. Roman Grothausmann
>> <grothausmann.roman at mh-**hannover.de <grothausmann.roman at mh-hannover.de><mailto:
>> grothausmann.roman at mh-**hannover.de <grothausmann.roman at mh-hannover.de>>>
>>
>> wrote:
>>
>>     On 02/08/13 16:06, Bill Lorensen wrote:
>>
>>         Marching Cubes should not generate non-manifold surfaces. The
>> offending
>>         triangle
>>         looks suspicious. What does the rest of your pipeline look like?
>>
>>
>>     Thanks Bill for looking into this. I get the very same output using
>> paraview
>>     and its contour filter when ticking "Generate Triangles" or using
>>     vmtkmarchingcubes (which seems to use only vtkMarchingCubes in
>>     vmtkmarchingcubes.py). To check it trice I used the simple program
>> below and
>>     got the same output again. Only paraview and its contour filter
>> without
>>     ticking "Generate Triangles" yields a different result.
>>
>>     _____________________________
>>
>>     #include <vtkSmartPointer.h>
>>     #include <vtkMetaImageReader.h>
>>     //#include <vtkImageConstantPad.h>
>>     #include <vtkMarchingCubes.h>
>>     #include <vtkXMLPolyDataWriter.h>//for vtp-files
>>
>>     #include <vtkCallbackCommand.h>
>>     #include <vtkCommand.h>
>>
>>
>>     void ProgressFunction ( vtkObject* caller, long unsigned int eventId,
>> void*
>>     clientData, void* callData )
>>           {
>>
>>           vtkAlgorithm *d= static_cast<vtkAlgorithm*>(__**caller);
>>
>>           fprintf(stderr, "\rFilter progress: %5.1f%%", 100.0 *
>> d->GetProgress());
>>           std::cerr.flush();
>>
>>           }
>>
>>     int main(int argc, char* argv[]){
>>           if( argc != 5 )
>>              {
>>              std::cerr << "Usage: " << argv[0];
>>              std::cerr << " inputImage";
>>              std::cerr << " outputMesh";
>>              std::cerr << " level normals";
>>              std::cerr << std::endl;
>>              return EXIT_FAILURE;
>>              }
>>
>>           if(!(strcasestr(argv[1],".mhd"**__))) {
>>
>>              std::cout << "The input should end with .mhd" << std::endl;
>>              return -1;
>>              }
>>
>>           if(!(strcasestr(argv[2],".vtp"**__))) {
>>
>>              std::cout << "The input should end with .vtp" << std::endl;
>>              return -1;
>>              }
>>
>>           vtkSmartPointer<__**vtkCallbackCommand> progressCallback =
>>     vtkSmartPointer<__**vtkCallbackCommand>::New();
>>           progressCallback->SetCallback(**__ProgressFunction);
>>
>>           vtkSmartPointer<__**vtkMetaImageReader> reader =
>>               vtkSmartPointer<__**vtkMetaImageReader>::New();
>>
>>
>>           reader->SetFileName(argv[1]);
>>           reader->Update();
>>
>>           vtkSmartPointer<__**vtkMarchingCubes> mc=
>>     vtkSmartPointer<__**vtkMarchingCubes>::New();
>>
>>           mc->SetInputConnection(reader-**__>GetOutputPort());
>>
>>           mc->SetValue(0, atof(argv[3]));
>>           //mc->ComputeNormalsOn();
>>           mc->SetComputeNormals(atoi(__**argv[4]));
>>
>>           //mc->ComputeGradientsOn();
>>           //mc->ComputeScalarsOn();
>>           std::cout << "Executing discrete marching cubes..." <<
>> std::endl;
>>           mc->AddObserver(vtkCommand::__**ProgressEvent,
>> progressCallback);
>>
>>           mc->Update();
>>           std::cout << std::endl << "done." << std::endl;
>>
>>           vtkSmartPointer<__**vtkXMLPolyDataWriter> Pwriter =
>>     vtkSmartPointer<__**vtkXMLPolyDataWriter>::New();
>>           Pwriter->SetFileName(argv[2]);
>>           Pwriter->SetInputConnection(__**mc->GetOutputPort());
>>
>>
>>           Pwriter->Update();
>>
>>           return EXIT_SUCCESS;
>>           }
>>
>>
>>
>>
>>
>>         On Fri, Aug 2, 2013 at 8:23 AM, Dr. Roman Grothausmann
>>         <grothausmann.roman at mh-__**hannover.de<grothausmann.roman at mh-__hannover.de>
>>         <mailto:grothausmann.roman at mh-**hannover.de<grothausmann.roman at mh-hannover.de>
>> >
>>         <mailto:grothausmann.roman at mh-**__hannover.de<grothausmann.roman at mh-__hannover.de>
>>
>>         <mailto:grothausmann.roman at mh-**hannover.de<grothausmann.roman at mh-hannover.de>
>> >>>
>>
>>         wrote:
>>
>>              Dear mailing list members,
>>
>>
>>              Recently, I came across a voxel-dataset that when meshed with
>>              vtkMarchingCubes results in a mesh that contains
>> non-manifold edges
>>         (magenta
>>              line in attached image).
>>              How can this be avoided?
>>              Using paraview's contour filter and switching off "Generate
>> Triangles"
>>              creates a slightly different surface mesh that does not
>> contain
>>         non-manifold
>>              edges. However vtkMarchingCubes does not seem to have any
>> option
>>         concerning
>>              triangulation.
>>              What filter/option do I have to use to get the same result
>> just
>>         with pure VTK?
>>
>>              As a workaround: Is it possible to split the mesh at
>> non-manifold
>>         edges?
>>              vtkIntersectionPolyDataFilter sounds promising but seems to
>> need
>>         surfaces
>>              not just the edges.
>>
>>              Any help or hints are very much appreciated
>>              Roman
>>
>>
>>
>>         --
>>         Unpaid intern in BillsBasement at noware dot com
>>
>>
>>     --
>>     Dr. Roman Grothausmann
>>
>>     Tomographie und Digitale Bildverarbeitung
>>     Tomography and Digital Image Analysis
>>
>>     Institut für Funktionelle und Angewandte Anatomie, OE 4120
>>     Medizinische Hochschule Hannover
>>     Carl-Neuberg-Str. 1
>>     D-30625 Hannover
>>
>>     Tel. +49 511 532-9574 <tel:%2B49%20511%20532-9574>
>>
>>     ______________________________**___________________
>>     Powered by www.kitware.com <http://www.kitware.com>
>>
>>
>>     Visit other Kitware open-source projects at
>>     http://www.kitware.com/__**opensource/opensource.html<http://www.kitware.com/__opensource/opensource.html>
>>
>>     <http://www.kitware.com/**opensource/opensource.html<http://www.kitware.com/opensource/opensource.html>
>> >
>>
>>     Please keep messages on-topic and check the VTK FAQ at:
>>     http://www.vtk.org/Wiki/VTK___**FAQ<http://www.vtk.org/Wiki/VTK___FAQ><
>> http://www.vtk.org/Wiki/VTK_**FAQ <http://www.vtk.org/Wiki/VTK_FAQ>>
>>
>>
>>     Follow this link to subscribe/unsubscribe:
>>     http://www.vtk.org/mailman/__**listinfo/vtkusers<http://www.vtk.org/mailman/__listinfo/vtkusers>
>>
>>     <http://www.vtk.org/mailman/**listinfo/vtkusers<http://www.vtk.org/mailman/listinfo/vtkusers>
>> >
>>
>>
>>
>>
>> --
>> Unpaid intern in BillsBasement at noware dot com
>>
>
> --
> Dr. Roman Grothausmann
>
> Tomographie und Digitale Bildverarbeitung
> Tomography and Digital Image Analysis
>
> Institut für Funktionelle und Angewandte Anatomie, OE 4120
> Medizinische Hochschule Hannover
> Carl-Neuberg-Str. 1
> D-30625 Hannover
>
> Tel. +49 511 532-9574
>



-- 
Unpaid intern in BillsBasement at noware dot com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20130802/7968581c/attachment.htm>


More information about the vtkusers mailing list