VTK體繪製(Volume Rendering)
阿新 • • 發佈:2021-01-23
原文章中編譯和執行結果不正確,修改了一些,VTK/8.2.0下驗證過。
#include <vtkSmartPointer.h> #include <vtkDICOMImageReader.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkCellPicker.h> #include <vtkImagePlaneWidget.h> #include <vtkMarchingCubes.h> #include <vtkImageCast.h> #include <vtkSmartVolumeMapper.h> #include <vtkVolumeProperty.h> #include <vtkVolume.h> #include <vtkPiecewiseFunction.h> #include <vtkColorTransferFunction.h> #include <vtkGPUVolumeRayCastMapper.h> #include <vtkImageMapToColors.h> #include <vtkProperty.h> #include <vtkImageActor.h> #include <vtkImageData.h> #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkInteractionStyle); VTK_MODULE_INIT(vtkRenderingFreeType); VTK_MODULE_INIT(vtkRenderingOpenGL2) VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2) int main(int argc, char* argv[]) { std::string folder = "dcm_folder"; //read all the dicom files with the received path. vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New(); reader->SetDirectoryName(folder.c_str()); reader->Update(); int imageDims[3]; reader->GetOutput()->GetDimensions(imageDims); //need include <vtkimagedata.h> cout << "dimension[] :" << imageDims[0] << " " << imageDims[1] << " " << imageDims[2] << endl; vtkSmartPointer<vtkImageCast> cast = vtkSmartPointer<vtkImageCast>::New(); cast->SetInputData((vtkDataObject*)reader->GetOutput()); //cast->SetOutputScalarTypeToFloat(); cast->Update(); //********************************************************************** vtkSmartPointer<vtkGPUVolumeRayCastMapper> volumeMapperGpu = vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New(); //基於GPU加速的光線投射體繪製演算法 volumeMapperGpu->SetInputData(cast->GetOutput()); volumeMapperGpu->SetImageSampleDistance(1.); //0.5 ==> 1.0 volumeMapperGpu->SetSampleDistance(1.0); volumeMapperGpu->SetAutoAdjustSampleDistances(1); //*********************************************************************** vtkSmartPointer<vtkVolumeProperty> volumeProperty = vtkSmartPointer<vtkVolumeProperty>::New();//定義物件屬性 volumeProperty->SetInterpolationTypeToLinear(); volumeProperty->ShadeOn(); volumeProperty->SetAmbient(0.4); //0.4 volumeProperty->SetDiffuse(0.5); volumeProperty->SetSpecular(0.1); vtkSmartPointer<vtkPiecewiseFunction> compositeOpacity = vtkSmartPointer<vtkPiecewiseFunction>::New(); //Defines a piecewise function mapping. compositeOpacity->AddPoint(60, 0.00); compositeOpacity->AddPoint(140, 0.40); compositeOpacity->AddPoint(180, 0.90); volumeProperty->SetScalarOpacity(compositeOpacity); vtkSmartPointer<vtkColorTransferFunction> color = vtkSmartPointer<vtkColorTransferFunction>::New(); color->AddRGBPoint(0, 0, 0, 0); color->AddRGBPoint(64, 1, 0.52, 0.30); color->AddRGBPoint(190.0, 1, 1, 1); color->AddRGBPoint(220, 0.2, 0.2, 0.2); volumeProperty->SetColor(color); vtkSmartPointer<vtkVolume> volume = vtkSmartPointer<vtkVolume>::New(); //represents a volume(data & properties) in a rendered scene volume->SetMapper(volumeMapperGpu); volume->SetProperty(volumeProperty); vtkSmartPointer<vtkRenderer> rendererVolume = vtkSmartPointer<vtkRenderer>::New(); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); rendererVolume->AddVolume(volume); renderWindow->AddRenderer(rendererVolume); renderWindowInteractor->SetRenderWindow(renderWindow); renderWindow->Render(); renderWindowInteractor->Start(); return 0; }
參考:
https://blog.csdn.net/sinat_21597219/article/details/86510756