[vtkusers] vtkDiscreteMarchingCubes extend

Cagatay Bilgin bilgincc at gmail.com
Mon May 7 18:10:58 EDT 2012


This looks like my misunderstanding of
the vtkPolyData GetPoints function. It
apparently returns physical coordinates,
not indices. When I convert the physical
coordinates to the image indices, I get the
result I was expecting.

Thank you,
Cagatay

On Mon, May 7, 2012 at 1:54 PM, Cagatay Bilgin <bilgincc at gmail.com> wrote:

> Hi Bill,
>
> #include "itkImageToVTKImageFilter.h"
> #include "itkVTKImageToImageFilter.h"
>
> #include <vtkDiscreteMarchingCubes.h>
> #include <vtkSmartPointer.h>
>
> #include  "itkImageFileWriter.h"
> #include  "itkImageFileReader.h"
>
>
> #include "vtkPolyDataMapper.h"
> #include "vtkActor.h"
> #include "vtkRenderer.h"
> #include "vtkRenderWindow.h"
> #include "vtkRenderWindowInteractor.h"
>
> int main(int argc, char*argv[]){
>
>   if(argc!=2){
>     std::cout << argv[0] << " inputFileName.mhd" << std::endl;
>     return -1;
>   }
>
>   typedef itk::Image<unsigned int,3> ImageType;
>   typedef itk::ImageFileReader<ImageType> ReaderType;
>   ReaderType::Pointer reader = ReaderType::New();
>   reader->SetFileName(argv[1]);
>   reader->Update();
>   ImageType::Pointer input = reader->GetOutput();
>
>   typedef itk::ImageToVTKImageFilter<ImageType> ITK2VTKType;
>   ITK2VTKType::Pointer itk2vtk = ITK2VTKType::New();
>   itk2vtk->SetInput(input);
>   itk2vtk->Update();
>
>   //extent and origin seems correct
>   double* origin  = itk2vtk->GetOutput()->GetOrigin();
>   int* extent  = itk2vtk->GetOutput()->GetExtent();
>   std::cout << input->GetLargestPossibleRegion().GetIndex() << std::endl;
>   std::cout << extent[0] << " " << extent[1] << " "
>             << extent[2] << " " << extent[3] << " "
>             << extent[4] << " " << extent[5] << std::endl;
>
>   vtkSmartPointer<vtkDiscreteMarchingCubes> discreteCubes =
>     vtkSmartPointer<vtkDiscreteMarchingCubes>::New();
>   discreteCubes->SetInput(itk2vtk->GetOutput());
>   discreteCubes->GenerateValues(1, 1, 1); //TODO Fixed numbers
>   discreteCubes->Update();
>
>   //The object starts around the 10th slice, there is a problem here.
>   vtkSmartPointer<vtkPolyData> cubes = discreteCubes->GetOutput();
>   for(unsigned int i = 0; i < cubes->GetNumberOfPoints(); i++)
>   {
>     double p[3];
>     cubes->GetPoint(i, p);
>     std::cout << p[0] << " " << p[1] << " " << p[2] << std::endl;
>   }
>
>
>   // Create a mapper and actor
>   vtkSmartPointer<vtkPolyDataMapper> surfaceMapper =
>     vtkSmartPointer<vtkPolyDataMapper>::New();
>   surfaceMapper->SetInputConnection(discreteCubes->GetOutputPort());
>   vtkSmartPointer<vtkActor> surfaceActor =
> vtkSmartPointer<vtkActor>::New();
>   surfaceActor->SetMapper(surfaceMapper);
>
>   // Create a renderer, render window, and interactor
>   vtkSmartPointer<vtkRenderer> renderer =
>     vtkSmartPointer<vtkRenderer>::New();
>   vtkSmartPointer<vtkRenderWindow> renderWindow =
>     vtkSmartPointer<vtkRenderWindow>::New();
>   renderWindow->AddRenderer(renderer);
>   vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
>     vtkSmartPointer<vtkRenderWindowInteractor>::New();
>   renderWindowInteractor->SetRenderWindow(renderWindow);
>
>   // Add the actor to the scene
>   renderer->AddActor(surfaceActor);
>   renderer->SetBackground(.1, .2, .3); // Background color blue
>   renderWindow->Render();
>   renderWindowInteractor->Start();
>
> }
>
> I have also uploaded the data I am using here:
> http://vision.lbl.gov/People/bilgin/input.tar.gz
>
> All I am trying to do is obtain the indices of points on the
> surface.
>
> Thank you,
> Cagatay
>
> On Mon, May 7, 2012 at 12:46 PM, Bill Lorensen <bill.lorensen at gmail.com>wrote:
>
>> Please post a small compilable example that illustrates the problem.
>>
>> On Mon, May 7, 2012 at 2:18 PM, Cagatay Bilgin <bilgincc at gmail.com>
>> wrote:
>> > Hello vtk-users
>> >
>> > I am having problems understanding the
>> > output of vtkDiscreteMarchingCubes.
>> >
>> > when I print the output polydata points, they
>> > do not match the input positions. It looks like
>> > the filter is doing a bounding box for the
>> > object. The extent and the origin seems
>> > to change. My sphere is located around 100,100,100
>> > with a radius of 10 in the input image, after the
>> > marching cubes it is around 10,10,10 with a
>> > radius of 10. How can make the filter give me
>> > the correct indices ?
>> >
>> > Thanks,
>> > Cagatay
>> >
>> > _______________________________________________
>> > Powered by www.kitware.com
>> >
>> > Visit other Kitware open-source projects at
>> > 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
>> >
>> > Follow this link to subscribe/unsubscribe:
>> > http://www.vtk.org/mailman/listinfo/vtkusers
>> >
>>
>>
>>
>> --
>> Unpaid intern in BillsBasement at noware dot com
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20120507/f5c4d7c1/attachment.htm>


More information about the vtkusers mailing list