现在的位置: 首页 > 综合 > 正文

使用vtk面绘制dicom医学断层图像

2018年04月20日 ⁄ 综合 ⁄ 共 3201字 ⁄ 字号 评论关闭

一 运行环境及工具:

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文件内容正确,而不仅仅是有问题就只修改源文件。 

以下截屏是我遇到过的一个链接错误:

抱歉!评论已关闭.