[vtkusers] Volume mesh of an object with convexe and concave regions

Tim Hutton tim.hutton at gmail.com
Tue Jun 14 08:21:11 EDT 2005


Stanislava,

Well, that is a very large volume (assuming there are a comparable
number of slices). You need to think carefully about the best way to
handle this. How are you extracting the points from the slices?
Perhaps you could down-sample the volume before extracting the
surface.

Tim

On 6/14/05, syssboxx-vtk at yahoo.fr <syssboxx-vtk at yahoo.fr> wrote:
> Hi Tim,
>  
> I downloaded your filter and converted your tcl program in c++ and it
> works.I tried it for 3 images and it works good but when I tried with all
> the slices of my volume it is extremelly slow.I'm working under XP,CPU
> 2.80GHz,1.00 GB RAM and my images are 832x1008 and it takes over 24 hours to
> process it and there's not result yet.How many time take it normally to
> process?Is there some way to optimize it cause like this it's a little bit
> of inapplicable.
>  
> Here is the code that i use:
>  
> 
> 
> #include <vtkPolyData.h>
> 
> #include <vtkPoints.h>
> 
> #include <vtkPolyDataMapper.h>
> 
> #include <vtkActor.h>
> 
> #include "vtkPowerCrustSurfaceReconstruction.h"
> 
> #include <vtkRenderer.h>
> 
> #include <vtkRenderWindow.h>
> 
> #include <vtkWindowToImageFilter.h>
> 
> #include <vtkPNGWriter.h>
> 
> #include <vtkProperty.h>
> 
> #include <vtkCamera.h>
> 
> #include "vtkRenderWindowInteractor.h"
> 
>  
> 
> int main( int argc, char *argv[] )
> 
> {
> 
> ///////////////////////////////////////////////////////////
> 
> FILE *donnees = fopen("points.txt","r");
> 
> vtkPolyData *data = vtkPolyData::New();
> 
> vtkPoints *points = vtkPoints::New();
> 
> int iCounter = 0;
> 
> while (!feof(donnees))
> 
> {
> 
> fprintf(stdout,"reading points: %i\r", iCounter);
> 
> float x, y, z;
> 
> fscanf(donnees,"%f %f %f\n", &x, &y, &z);
> 
> points->InsertPoint(iCounter++, x, y, z);
> 
> }
> 
> data->SetPoints(points);
> 
> fclose(donnees);
> 
> fprintf(stdout,"\n\n");
> 
> /////////////////////////////////////////////////////////
> 
> // render the raw input points into the first renderer
> 
> vtkPolyDataMapper
> *rawpointsmapper=vtkPolyDataMapper::New();
> 
> rawpointsmapper-> SetInput(data); 
> 
> vtkActor *rawpointsactor=vtkActor::New();
> 
> rawpointsactor ->SetMapper( rawpointsmapper);
> 
> rawpointsactor ->GetProperty()-> SetColor( 0, 0, 0);
> 
> rawpointsactor ->SetScale(1.0,1.0,25);
> 
> // construct the surface and render into the second renderer
> 
> vtkPowerCrustSurfaceReconstruction
> *surf=vtkPowerCrustSurfaceReconstruction::New();
> 
> surf -> SetInput(data);
> 
> vtkPolyDataMapper *map=vtkPolyDataMapper::New();
> 
> map -> SetInput (surf ->GetOutput());
> 
> vtkActor *surfaceActor=vtkActor::New();
> 
> surfaceActor -> SetMapper (map);
> 
> surfaceActor ->GetProperty()-> SetDiffuseColor (1.0000, 0.3882, 0.2784);
> 
> surfaceActor ->GetProperty()-> SetSpecularColor (1, 1, 1);
> 
> surfaceActor ->GetProperty()-> SetSpecular (.4);
> 
> surfaceActor ->GetProperty()-> SetSpecularPower( 50);
> 
> surfaceActor ->SetScale(1.0,1.0,25);
> 
> // render the medial surface into a third renderer
> 
> surf-> Update(); 
> 
> // (because GetMedialSurface is not part of the normal pipeline)
> 
> vtkPolyDataMapper *medialmapper=vtkPolyDataMapper::New();
> 
> medialmapper -> SetInput (surf ->GetMedialSurface());
> 
> medialmapper ->ScalarVisibilityOff();
> 
> vtkActor *medialactor=vtkActor::New();
> 
> medialactor -> SetMapper( medialmapper);
> 
> medialactor ->GetProperty()-> SetDiffuseColor (0.1000, 0.8882, 0.2784);
> 
> medialactor ->GetProperty()-> SetSpecularColor (1 ,1, 1);
> 
> medialactor ->GetProperty()-> SetSpecular (.4);
> 
> medialactor ->GetProperty()-> SetSpecularPower (50);
> 
> medialactor ->GetProperty()-> SetRepresentationToWireframe();
> 
> medialactor ->SetScale(1.0,1.0,25);
> 
> // Render everything
> 
> vtkRenderer *ren1=vtkRenderer::New();
> 
> vtkRenderer *ren2=vtkRenderer::New();
> 
> vtkRenderer *ren3=vtkRenderer::New();
> 
> vtkRenderWindow *renWin=vtkRenderWindow::New();
> 
> renWin ->AddRenderer( ren1);
> 
> renWin ->AddRenderer (ren2);
> 
> renWin ->AddRenderer (ren3);
> 
> renWin ->SetSize (1000 ,1000);
> 
> // Add the actors to the renderer
> 
> ren1-> AddActor (rawpointsactor);
> 
> ren2 ->AddActor (surfaceActor);
> 
> ren3 ->AddActor (medialactor);
> 
> // set the properties of the renderers
> 
> ren1 ->SetBackground (1, 1, 1);
> 
> ren1 ->SetViewport (0.0 ,0.0, 0.33, 1.0);
> 
> ren1 ->GetActiveCamera() -> SetPosition (1, -1 ,0);
> 
> ren1 ->ResetCamera();
> 
> ren2 ->SetBackground (1, 1, 1);
> 
> ren2 ->SetViewport (0.33 ,0.0, 0.66, 1.0);
> 
> ren2 ->GetActiveCamera() -> SetPosition (1 ,-1, 0 ); 
> 
> ren2 ->ResetCamera();
> 
> ren3 ->SetBackground (1, 1, 1);
> 
> ren3 ->SetViewport (0.66 ,0.0 ,1.0, 1.0);
> 
> ren3 ->GetActiveCamera() ->SetPosition (1 ,-1, 0);
> 
> ren3 ->ResetCamera();
> 
> vtkRenderWindowInteractor *iren =
> vtkRenderWindowInteractor::New();
> 
> iren->SetRenderWindow(renWin);
> 
> //render the image
> 
> renWin ->Render();
> 
> iren->Start();
> 
> // output the image to file (used to generate the initial regression image)
> 
> vtkWindowToImageFilter
> *to_image=vtkWindowToImageFilter::New();
> 
> to_image ->SetInput ( renWin);
> 
> vtkPNGWriter *to_png=vtkPNGWriter::New();
> 
> to_png-> SetFileName ("TestPowerCrust.png");
> 
> to_png ->SetInput(to_image-> GetOutput());
> 
> to_png -> Write();
> 
> return EXIT_SUCCESS;
> 
> }
> 
> Regards,
> 
> Stanislava
> 
>  
> 
>  
> 
>  
> 
> Tim Hutton <tim.hutton at gmail.com> a écrit :
> Stanislava,
> 
> You could try some form of surface reconstruction. This code is
> already written for VTK which should save you time:
> http://www.sq3.org.uk/powercrust
> 
> From the image you sent it looks like it would work. However, the best
> results should be obtained from your marching cubes approach since the
> original image is a volume. Maybe you need to fill the contours before
> running vtkMarchingCubes?
> 
> Tim
> 
> On 6/10/05, Torsten Sadowski wrote:
> > Have a look at this. Maybe it does what you need.
> > 
> > Torsten
> > 
> > 
> > http://www.ices.utexas.edu/~jessica/software/index.html
> > 
> > On Fri, 10 Jun 2005 syssboxx-vtk at yahoo.fr wrote:
> > 
> > > Hi vtk users,
> > > I have to visualize a head from contours of MRI images.I tried Delaunay
> from a txt file with set of points with coordinates.My object has concave
> and convexe regions,so for the convexes it gives a good results but for the
> others it's terrible!! (I jointed the result) Is there a way to apply some
> other filter after Delaunay for improve the result in the concaves. I tried
> also MarchingCubes applied on the volume with the contours but results are
> neither good.
> > > That's the best choice for this kind of object to get best result and
> the same time I want a mesh over the originaly points.
> > >
> > > Thanks for your suggestions
> > >
> > > Stanislava
> > >
> > >
> > >
> > >
> > > ---------------------------------
> > > Appel audio GRATUIT partout dans le monde avec le nouveau Yahoo!
> Messenger
> > > Téléchargez le ici !
> > >
> > >
> > >
> > > ---------------------------------
> > > Appel audio GRATUIT partout dans le monde avec le nouveau Yahoo!
> Messenger
> > > Téléchargez le ici !
> > >
> > >
> > >
> > >
> > > ---------------------------------
> > > Appel audio GRATUIT partout dans le monde avec le nouveau Yahoo!
> Messenger
> > > Téléchargez le ici !
> > _______________________________________________
> > This is the private VTK discussion list.
> > Please keep messages on-topic. Check the FAQ at:
> http://www.vtk.org/Wiki/VTK_FAQ
> > Follow this link to subscribe/unsubscribe:
> > http://www.vtk.org/mailman/listinfo/vtkusers
> > 
> 
> 
> -- 
> Tim Hutton - http://www.sq3.org.uk
> 
> 
> ________________________________
> Appel audio GRATUIT partout dans le monde avec le nouveau Yahoo! Messenger
> Téléchargez le ici ! 
> 
> 


-- 
Tim Hutton  -  http://www.sq3.org.uk



More information about the vtkusers mailing list