[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