例子通过vtkVolume16Reader读取人头一系列的二维切片,采用vtkContourFilter滤波器抽取等值面为500的皮肤,在等值面上利用vtkPolyDataNormals产生一系列的法线,用vtkOutlineFilter滤波器在图像外面产生个外围的边框。
在console下的代码如下:
//Surface rendering #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 "vtkAutoInit.h" VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2 VTK_MODULE_INIT(vtkInteractionStyle); void main() { vtkSmartPointer<vtkRenderer>renderer = vtkSmartPointer<vtkRenderer>::New(); vtkSmartPointer<vtkRenderWindow>renWin = vtkSmartPointer<vtkRenderWindow>::New(); renWin->AddRenderer(renderer); 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->SetFilePattern("%s.%d"); v16->SetDataSpacing(3.2, 3.2, 1.5); vtkSmartPointer<vtkContourFilter>skinExtractor = vtkSmartPointer<vtkContourFilter>::New(); skinExtractor->SetInputConnection(v16->GetOutputPort()); skinExtractor->SetValue(0,500); vtkSmartPointer<vtkPolyDataNormals>skinNormals = vtkSmartPointer<vtkPolyDataNormals>::New(); skinNormals->SetInputConnection(skinExtractor->GetOutputPort()); skinNormals->SetFeatureAngle(60.0); vtkSmartPointer<vtkPolyDataMapper>skinMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); skinMapper->SetInputConnection(skinNormals->GetOutputPort()); skinMapper->ScalarVisibilityOff(); vtkSmartPointer<vtkActor>skin = vtkSmartPointer<vtkActor>::New(); skin->SetMapper(skinMapper); 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>aCamera = vtkSmartPointer<vtkCamera>::New(); aCamera->SetViewUp(0, 0, -1); aCamera->SetPosition(0, 1, 0); aCamera->SetFocalPoint(0, 0, 0); aCamera->ComputeViewPlaneNormal(); aCamera->Azimuth(30.0); aCamera->Elevation(30.0); renderer->AddActor(outline); renderer->AddActor(skin); renderer->SetActiveCamera(aCamera); renderer->ResetCamera(); aCamera->Dolly(1.5);//close to the image renderer->SetBackground(0.2, 0.3, 0.4); renWin->SetSize(320, 240); renderer->ResetCameraClippingRange(); vtkSmartPointer<vtkInteractorStyleTrackballCamera>style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New(); iren->SetInteractorStyle(style); iren->Initialize(); iren->Start(); return; }