[vtkusers] Exporting vtkVolume to STL/PLY

Ievgen Petrashchuk vaper at ukr.net
Mon Aug 3 09:34:34 EDT 2015


I think it is CT/MRT. Thank you for your answer. Do vtk has something better than marching cubes if you say it's not good enough? 

31 July 2015, 18:45:38, by "Bill Lorensen" < bill.lorensen at gmail.com >: 

stl and ply store triangles and, for ply, polygons. Your example is rendering a volume directly. You would need to extract polygonal surfaces from your volume. This means you will need to perform some sort of segmentation to identify the structures to model with polygons. Marching Cubes is one technique that extracts surfaces based on a threshold. But most medical segmentation requires more sophisticated techniques. 
What is the modality of the dicom files/ CT, MRI, PET, ...? 

On Fri, Jul 31, 2015 at 11:16 AM, Ievgen Petrashchuk < vaper at ukr.net > wrote: 
Hello, I've been playing with VTK examples and got the tool that renders 3D mesh, based on DICOM files. 
How can I export the mesh to .ply or .stl file? 

My code: 
#include <vtkVersion.h> #include <vtkSmartPointer.h> #include <vtkSphere.h> #include <vtkSampleFunction.h> #include <vtkSmartVolumeMapper.h> #include <vtkColorTransferFunction.h> #include <vtkPiecewiseFunction.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkVolumeProperty.h> #include <vtkCamera.h> #include <vtkImageShiftScale.h> #include <vtkImageData.h> #include <vtkPointData.h> #include <vtkDataArray.h> #include <vtkXMLImageDataReader.h> #include <vtkPLYWriter.h> #include <vtkDICOMImageReader.h> #include <vtkVolumeOutlineSource.h> 
int main(int argc, char* argv[]) {     // Verify input arguments     if ( argc != 3 )     {         std::cout << "Usage: " << argv[0]         << " FolderName" << "Export.ply" << std::endl;         return EXIT_FAILURE;     } 
    std::string folder = argv[1];     std::string output = argv[2]; 
    // Read all the DICOM files in the specified directory.     vtkSmartPointer<vtkDICOMImageReader> reader =             vtkSmartPointer<vtkDICOMImageReader>::New();     reader->SetDirectoryName(folder.c_str());     reader->Update(); 
    //Create vtkImageData     vtkSmartPointer<vtkImageData> imageData =             vtkSmartPointer<vtkImageData>::New(); 
    imageData->ShallowCopy(reader->GetOutput()); 
    //renderer     vtkSmartPointer<vtkRenderWindow> renWin =             vtkSmartPointer<vtkRenderWindow>::New();     vtkSmartPointer<vtkRenderer> ren1 =             vtkSmartPointer<vtkRenderer>::New();     ren1->SetBackground(0,0,0); 
    renWin->AddRenderer(ren1); 
    renWin->SetSiz e(301,300); // intentional odd and NPOT  width/height 
    vtkSmartPointer<vtkRenderWindowInteractor> iren =             vtkSmartPointer<vtkRenderWindowInteractor>::New();     iren->SetRenderWindow(renWin); 
    renWin->Render(); // make sure we have an OpenGL context. 
    vtkSmartPointer<vtkSmartVolumeMapper> volumeMapper =             vtkSmartPointer<vtkSmartVolumeMapper>::New();     volumeMapper->SetBlendModeToComposite(); // composite first #if VTK_MAJOR_VERSION <= 5     volumeMapper->SetInputConnection(imageData->GetProducerPort()); #else   volumeMapper->SetInputData(imageData); #endif     vtkSmartPointer<vtkVolumeProper ty> volumeProperty =             vtkSmartPointer<vtkVolumeProperty>::New();     volumeProperty->ShadeOff();     volumeProperty->SetInterpolationType(VTK_LINEAR_INTERPOLATION); 
    vtkSmartPointer<vtkPiecewiseFunction> compositeOpacity =             vtkSmartPointer<vtkPiecewiseFunction>::New();     compositeOpacity->AddPoint(-1000.0,0.0);     compositeOpacity->AddPoint(0.0,0.0);     compositeOpacity->AddPoint(1000.0,0.89);     volumeProperty->SetScalarOpacity(compositeOpacity); // composite first. 
    vtkSmartPointer<vtkColorTransferFunction> color =             vtkSmartPointer<vtkColorTransferFunction>::New(); 
< /div>     color->AddRGBPoint(0,    0.0, 0.0, 0.0);     color->AddRGBPoint(1000,  1.0, 1, 1);     color->AddRGBPoint(-1000,    0.0, 0.0, 0.0);     volumeProperty->SetColor(color); 
    volumeProperty->SetInterpolationTypeToLinear();     volumeProperty->ShadeOff(); 
    vtkSmartPointer<vtkVolume> volume =             vtkSmartPointer<vtkVolume>::New();     volume->SetMapper(volumeMapper);     volume->SetProperty(volumeProperty); 

    ren1->AddViewProp(volume);     ren1->ResetCamera(); 
    // Render composite. In default mode. For coverage.     renWin->R ender(); 
    // 3D texture mode. For coverage.     volumeMapper->SetRequestedRenderModeToDefault();     renWin->Render(); 
    // Software mode, for coverage. It also makes sure we will get the same     // regression image on all platforms.     volumeMapper->SetRequestedRenderModeToRayCast();     renWin->Render(); 
    iren->Start(); 
    return EXIT_SUCCESS; } 
_______________________________________________ 
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 

Search the list archives at: http://markmail.org/search/?q=vtkusers 

Follow this link to subscribe/unsubscribe: 
http://public.kitware.com/mailman/listinfo/vtkusers 




-- 
Unpaid intern in BillsBasement at noware dot com 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20150803/90dbab4b/attachment.html>


More information about the vtkusers mailing list