读取一系列人体头部二维切片,抽取皮肤与骨骼
console下实现如下:
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
#include<vtkRenderer.h>
#include<vtkRenderWindow.h>
#include<vtkRenderWindowInteractor.h>
#include<vtkInteractorStyleTrackballCamera.h>
#include<vtkVolume16Reader.h>
#include<vtkPolyDataMapper.h>
#include<vtkActor.h>
#include<vtkOutlineFilter.h>
#include<vtkCamera.h>
#include<vtkProperty.h>
#include<vtkPolyDataNormals.h>
#include<vtkContourFilter.h>
#include<vtkSmartPointer.h>
#include<vtkStripper.h>
int main()
{
vtkSmartPointer<vtkRenderer>render = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow>renWin = vtkSmartPointer<vtkRenderWindow>::New();
renWin->AddRenderer(render);
vtkSmartPointer<vtkRenderWindowInteractor>iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();
iren->SetRenderWindow(renWin);
vtkSmartPointer<vtkVolume16Reader>v16 = vtkSmartPointer<vtkVolume16Reader>::New();
v16->SetDataDimensions(64, 64);
v16->SetDataByteOrderToLittleEndian();
v16->SetFilePrefix("F:\\vtkshuju\\Data\\headsq\\quarter");
v16->SetImageRange(1, 93);
v16->SetDataSpacing(3.2, 3.2, 1.5);
vtkSmartPointer<vtkContourFilter>skinExtractor = vtkSmartPointer<vtkContourFilter>::New();
skinExtractor->SetInputConnection(v16->GetOutputPort());
skinExtractor->SetValue(0, 500);
vtkSmartPointer<vtkPolyDataNormals>skinNorms = vtkSmartPointer<vtkPolyDataNormals>::New();
skinNorms->SetInputConnection(skinExtractor->GetOutputPort());
skinNorms->SetFeatureAngle(60.0);
vtkSmartPointer<vtkStripper>skinStrip = vtkSmartPointer<vtkStripper>::New();
skinStrip->SetInputConnection(skinNorms->GetOutputPort());
vtkSmartPointer<vtkPolyDataMapper>skinMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
skinMapper->SetInputConnection(skinStrip->GetOutputPort());
skinMapper->ScalarVisibilityOff();
vtkSmartPointer<vtkActor>skinActor = vtkSmartPointer<vtkActor>::New();
skinActor->SetMapper(skinMapper);
skinActor->GetProperty()->SetDiffuseColor(1, 0.49, 0.25);
skinActor->GetProperty()->SetSpecular(0.3);
skinActor->GetProperty()->SetSpecularPower(20);
skinActor->GetProperty()->SetOpacity(0.5);
vtkSmartPointer<vtkContourFilter>boneExtractor = vtkSmartPointer<vtkContourFilter>::New();
boneExtractor->SetInputConnection(v16->GetOutputPort());
boneExtractor->SetValue(0, 1150);
vtkSmartPointer<vtkPolyDataNormals>boneNormals = vtkSmartPointer<vtkPolyDataNormals>::New();
boneNormals->SetInputConnection(boneExtractor->GetOutputPort());
boneNormals->SetFeatureAngle(60.0);
vtkSmartPointer<vtkStripper>boneStrip = vtkSmartPointer<vtkStripper>::New();
boneStrip->SetInputConnection(boneNormals->GetOutputPort());
vtkSmartPointer<vtkPolyDataMapper>boneMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
boneMapper->SetInputConnection(boneStrip->GetOutputPort());
boneMapper->ScalarVisibilityOff();
vtkSmartPointer<vtkActor>bone = vtkSmartPointer<vtkActor>::New();
bone->SetMapper(boneMapper);
bone->GetProperty()->SetDiffuseColor(1, 1, 0.9412);
vtkSmartPointer<vtkOutlineFilter>outLineData = vtkSmartPointer<vtkOutlineFilter>::New();
outLineData->SetInputConnection(v16->GetOutputPort());
vtkSmartPointer<vtkPolyDataMapper> mapOutline = vtkSmartPointer<vtkPolyDataMapper>::New();
mapOutline->SetInputConnection(outLineData->GetOutputPort());
vtkSmartPointer<vtkActor>outline = vtkSmartPointer<vtkActor>::New();
outline->SetMapper(mapOutline);
outline->GetProperty()->SetColor(0, 0, 0);
vtkSmartPointer<vtkCamera>camera = vtkSmartPointer<vtkCamera>::New();
camera->SetViewUp(0, 0, -1);
camera->SetPosition(0, 1, 0);
camera->SetFocalPoint(0, 0, 0);
camera->ComputeViewPlaneNormal();
camera->Azimuth(30.0);
camera->Elevation(30.0);
render->AddActor(outline);
render->AddActor(skinActor);
render->AddActor(bone);
render->SetActiveCamera(camera);
render->ResetCamera();
render->SetBackground(0.2, 0.3, 0.4);
camera->Dolly(1.5);
render->ResetCameraClippingRange();
vtkSmartPointer<vtkInteractorStyleTrackballCamera>style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
iren->SetInteractorStyle(style);
iren->Initialize();
iren->Start();
return 0;
}