一 运行环境及工具:
linux ubuntu 14.04 desktop
vtk6.1.0
cmake 2.8.12
二 使用vtk面绘制需要用到较多的vtk components,必须在cmake编译时加进去,否则会出现ld 链接错误: 典型的如undefined reference to vtkOutlineFilter::New()。
我的CMakeLists.txt全文如下
cmake_minimum_required(VERSION 2.8.5 FATAL_ERROR) PROJECT (Medical) find_package(VTK COMPONENTS vtkFiltersGeometry vtkFiltersModeling vtkIOImage vtkIOXML vtkImagingStatistics vtkInteractionStyle vtkRenderingVolumeOpenGL vtkTestingRendering vtksys ) include(${VTK_USE_FILE}) add_executable(m1c MACOSX_BUNDLE m1c.cc) target_link_libraries(m1c ${VTK_LIBRARIES})
这里我的源文件为m1c.cc
三 编写源文件
源文件可参考vtk Medical 例子,但文件格式等内容不同。 其部分内容也可能不同,关键取决于实际应用,如皮肤的ct值为500,就不需改变。但其他选项可能需要调整,不一一说明。
#include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkDICOMImageReader.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> int main() { vtkSmartPointer<vtkRenderer> aRenderer=vtkSmartPointer<vtkRenderer>::New(); vtkSmartPointer<vtkRenderWindow> renWin=vtkSmartPointer<vtkRenderWindow>::New(); renWin->AddRenderer(aRenderer); vtkSmartPointer<vtkRenderWindowInteractor> iren=vtkSmartPointer<vtkRenderWindowInteractor>::New(); iren->SetRenderWindow(renWin); vtkSmartPointer<vtkDICOMImageReader> v16=vtkSmartPointer<vtkDICOMImageReader>::New(); v16->SetDataByteOrderToLittleEndian(); v16->SetDirectoryName("/home/ace/vtklearn/pa10");// 文件目录path 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); //New aCamera->Elevation(30.0);//New // aRenderer->AddActor(outline); aRenderer->AddActor(skin); aRenderer->SetActiveCamera(aCamera); aRenderer->ResetCamera(); aCamera->Dolly(1.5); // aRenderer->SetBackground(1,1,1);// can change renWin->SetSize(640,480); // aRenderer->ResetCameraClippingRange(); // iren->Initialize(); iren->Start(); return EXIT_SUCCESS; }
四 运行实例
由于dicom源文件包含隐私数据,在此就不展示原数据了。这里是一个完整的显示效果。
五 注意事项
要保证CMakeLists.txt文件内容正确,而不仅仅是有问题就只修改源文件。
以下截屏是我遇到过的一个链接错误: