[vtkusers] Cut slices out of polydata
Marc Huber
marchuber.hft at gmx.de
Fri May 10 03:36:13 EDT 2013
I found out how to solve it:
When I remove the vtkLinearExtrusionFilter it works.
Best regards
Marc
Am 5/10/2013 8:40 AM, schrieb Marc Huber:
> I want to reach a jpg file because I have to process the image afterwards.
> It works fine for the circle so I expect it should also work for my
> polydata.
>
> But yes I have tried it with a *.mhd file.
> When I display it with a vtkImageViewer2 and move the mouse I get a
> white square, but this is not my expected slice.
> If I render my slice in 3D ("circle" object) it shows it correctly.
>
> Best regards
> Marc
>
> Am 5/10/2013 1:25 AM, schrieb Alex Malyushytskyy:
>> Have you tried to use vtkMetaImageWriter
>> to write data for your code, so you can stop questioning if problem
>> is with the way you write jpg?
>>
>> Alex
>>
>>
>>
>>
>> On Thu, May 9, 2013 at 11:35 AM, Marc Huber <marchuber.hft at gmx.de
>> <mailto:marchuber.hft at gmx.de>> wrote:
>>
>> 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();
>>
>> _______________________________________________
>> Powered by www.kitware.com <http://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
>>
>>
>
>
>
>
> _______________________________________________
> 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20130510/26d77d89/attachment.htm>
More information about the vtkusers
mailing list