[vtkusers] Cut slices out of polydata
Marc Huber
marchuber.hft at gmx.de
Thu May 9 14:35:08 EDT 2013
Hi,
I wanted to cut a polydata object in several slices
When I apply this example it works all fine:
http://www.vtk.org/Wiki/VTK/Examples/Cxx/PolyData/PolyDataContourToImageData
But I have a polydata object and no sphere and I want to produce a *.jpg
file.
My result is just a black image and I'm wondering what the problem might be.
Has anyone an idea?
Here is my code (Original code commented out and mine in red):
//ORIGINAL CODE
//vtkSmartPointer<vtkSphereSource> sphereSource =
vtkSmartPointer<vtkSphereSource>::New();
// sphereSource->SetPhiResolution(30);
// sphereSource->SetThetaResolution(30);
// sphereSource->SetCenter(40, 40, 0);
// sphereSource->SetRadius(20);
//MY CODE
vtkSmartPointer<vtkPolyData> polydata =
vtkSmartPointer<vtkPolyData>::New();
polydata->ShallowCopy(stlActor->GetMapper()->GetInputAsDataSet());
vtkSmartPointer<vtkCutter> circleCutter =
vtkSmartPointer<vtkCutter>::New();
//circleCutter->SetInputConnection(sphereSource->GetOutputPort());
//ORIGINAL
circleCutter->SetInputConnection(polydata->GetProducerPort()); //MY CODE
vtkSmartPointer<vtkPlane> cutPlane = vtkSmartPointer<vtkPlane>::New();
//cutPlane->SetOrigin(sphereSource->GetCenter()); //ORIGINAL
cutPlane->SetOrigin(polydata->GetCenter()); //MY CODE
cutPlane->SetNormal(0, 0, 1);
circleCutter->SetCutFunction(cutPlane);
vtkSmartPointer<vtkStripper> stripper =
vtkSmartPointer<vtkStripper>::New();
stripper->SetInputConnection(circleCutter->GetOutputPort()); // valid circle
stripper->Update();
// that's our circle
vtkSmartPointer<vtkPolyData> circle = stripper->GetOutput();
// write circle out
vtkSmartPointer<vtkXMLPolyDataWriter> polyDataWriter =
vtkSmartPointer<vtkXMLPolyDataWriter>::New();
polyDataWriter->SetInput(circle);
polyDataWriter->SetFileName("circle.vtp");
polyDataWriter->SetCompressorTypeToNone();
polyDataWriter->SetDataModeToAscii();
polyDataWriter->Write();
// prepare the binary image's voxel grid
double bounds[6];
circle->GetBounds(bounds);
double spacing[3]; // desired volume spacing
spacing[0] = 0.5;
spacing[1] = 0.5;
spacing[2] = 0.5;
vtkSmartPointer<vtkImageData> whiteImage =
vtkSmartPointer<vtkImageData>::New();
whiteImage->SetSpacing(spacing);
// compute dimensions
int dim[3];
for (int i = 0; i < 3; i++)
{
dim[i] = static_cast<int>(ceil((bounds[i * 2 + 1] - bounds[i *
2]) /spacing[i])) + 1;
if (dim[i] < 1){ dim[i] = 1;}
}
whiteImage->SetDimensions(dim);
whiteImage->SetExtent(0, dim[0] - 1, 0, dim[1] - 1, 0, dim[2] - 1);
double origin[3];
// NOTE: I am not sure whether or not we had to add some offset!
origin[0] = bounds[0];// + spacing[0] / 2;
origin[1] = bounds[2];// + spacing[1] / 2;
origin[2] = bounds[4];// + spacing[2] / 2;
whiteImage->SetOrigin(origin);
whiteImage->SetScalarTypeToUnsignedChar();
whiteImage->AllocateScalars();
// fill the image with foreground voxels:
unsigned char inval = 255;
unsigned char outval = 0;
vtkIdType count = whiteImage->GetNumberOfPoints();
for (vtkIdType i = 0; i < count; ++i)
{
whiteImage->GetPointData()->GetScalars()->SetTuple1(i, inval);
}
// sweep polygonal data (this is the important thing with contours!)
vtkSmartPointer<vtkLinearExtrusionFilter> extruder =
vtkSmartPointer<vtkLinearExtrusionFilter>::New();
extruder->SetInput(circle);
extruder->SetScaleFactor(1.);
extruder->SetExtrusionTypeToNormalExtrusion();
extruder->SetVector(0, 0, 1);
extruder->Update();
// polygonal data --> image stencil:
vtkSmartPointer<vtkPolyDataToImageStencil> pol2stenc =
vtkSmartPointer<vtkPolyDataToImageStencil>::New();
pol2stenc->SetTolerance(0); // important if
extruder->SetVector(0, 0, 1) !!!
pol2stenc->SetInputConnection(extruder->GetOutputPort());
pol2stenc->SetOutputOrigin(origin);
pol2stenc->SetOutputSpacing(spacing);
pol2stenc->SetOutputWholeExtent(whiteImage->GetExtent());
pol2stenc->Update();
// cut the corresponding white image and set the background:
vtkSmartPointer<vtkImageStencil> imgstenc =
vtkSmartPointer<vtkImageStencil>::New();
imgstenc->SetInput(whiteImage);
imgstenc->SetStencil(pol2stenc->GetOutput());
imgstenc->ReverseStencilOff();
imgstenc->SetBackgroundValue(outval);
imgstenc->Update();
//ORIGINAL CODE
//vtkSmartPointer<vtkMetaImageWriter> imageWriter =
// vtkSmartPointer<vtkMetaImageWriter>::New();
//imageWriter->SetFileName("labelImage.mhd");
//imageWriter->SetInputConnection(imgstenc->GetOutputPort());
//imageWriter->Write();
//MY CODE
vtkSmartPointer<vtkJPEGWriter> cutWriter =
vtkSmartPointer<vtkJPEGWriter>::New();
cutWriter->SetFileName("cut1.jpg");
cutWriter->SetInputConnection(imgstenc->GetOutputPort());
cutWriter->Write();
--
Best regards / Mit freundlichen Grüßen
Marc Huber
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20130509/ad481e93/attachment.htm>
More information about the vtkusers
mailing list