VTK 面绘制
(2012-06-11 17:19:49)
操作系统:Windows XP
编程环境:VS2008
VTK版本:vtk-5.8.0
////////////////////////////////////////////////////////////////////////////////////////////
// 说明:面绘制实现三维重建。使用的是经典的 Marching Cubes 算法,也叫移动立方体法。
// 面绘制是采用分割技术对一系列的二维图像进行轮廓识别、提取等操作,最终还原出被检测物体的三维模型,并以表面的方式显示出来。
// 数据流结构为:
//
读取器-》提取等值面-》数据处理-》映射器-》实例化角色-》绘制器-》绘制窗口-》交互器-》交换方式。
// Marching Cubes 算法简介:首先,假定原始数据是离散的三维空间规则数据场,(断层扫描仪CT及核磁共振仪MRI产生的图像均属于这一类型);其次,给出所求等值面的值(为了在这一数据场中构造等值面);最后,找出等值面经过的体元位置,求出该体元内的等值面并计算出相关参数(以便由常用的图形软件包或图形硬件提供的面绘制功能绘制等值面)。
// 1、VTK提供了两种提取等值面的类:vtkContourFilter 滤波器和封装了 MC(Marching Cubes)算法类vtkMarchingCubes。
// 2、数据处理:通过vtkPolyDataNormals在等值面上产生法向量;通过vtkStripper在等值面上产生纹理或三角面片。
////////////////////////////////////////////////////////////////////////////////////////////
// VTK headers
#include "vtkVolume16Reader.h"
#include "vtkRenderWindowInteracto
r.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkMarchingCubes.h"
#include "vtkStripper.h"
#include "vtkActor.h"
#include "vtkPolyDataMapper.h"
#include "vtkProperty.h"
#include "vtkCamera.h"
#include "vtkBoxWidget.h"
#include <iostream>
int main()
{
//读取二维切片数据序列
vtkVolume16Reader *reader = vtkVolume16Reader::New();
reader->SetDataDimensions(64, 64); //设置像素
reader->SetDataByteOrderToLittle
Endian();
reader->SetFilePrefix("D:\\vtk\\vtkdata\\Data\\headsq\\quarter");//设置读取路径
reader->SetImageRange(1, 93);
reader->SetDataSpacing(3.2, 3.2, 1.5);
//抽取等值面为骨头的信息
vtkMarchingCubes *boneExtractor = vtkMarchingCubes::New();
boneExtractor->SetInputConnection(reader->GetOutputPort());
boneExtractor->SetValue(0,500); //设置提取的等值信息
//剔除旧的或废除的数据单元,提高绘制速度
vtkStripper *boneStripper = vtkStripper::New(); //三角带连接
boneStripper->SetInputConnection(boneExtractor->GetOutputPort());
//建立映射
vtkPolyDataMapper *boneMapper = vtkPolyDataMapper::New();
boneMapper->SetInput(boneStripper->GetOutput());
//建立角色
vtkActor *bone = vtkActor::New();
bone->SetMapper(boneMapper);
bone->GetProperty()->SetDiffuseColor(.1,.94,.52);
bone->GetProperty()->SetSpecular(.3);
bone->GetProperty()->SetSpecularPower(20);
//标准句子
//定义绘制器
vtkRenderer *aRenderer = vtkRenderer::New();
//定义绘制窗口
vtkRenderWindow *renWin = vtkRenderWindow::New();
renWin->AddRenderer(aRenderer);
//定义窗口交互器
vtkRenderWindowInteracto
r *iren = vtkRenderWindowInteracto
r::New();
iren->SetRenderWindow(renWin);
//创建一个camera
vtkCamera *aCamera = vtkCamera::New();
aCamera->SetViewUp(0,0,-1);
aCamera->SetPosition(0,1,0);
aCamera->SetFocalPoint(0,0,0);
aRenderer->AddActor(bone);
aRenderer->SetActiveCamera(aCamera);
aRenderer->ResetCamera();
aCamera->Dolly(1.5);
aRenderer->SetBackground(0,0,0);
aRenderer->ResetCameraClippingRange
();
vtkBoxWidget *boxWidget = vtkBoxWidget::New();
boxWidget->SetInteractor(iren);
boxWidget->SetPlaceFactor(1.25);
boxWidget->SetProp3D(bone);
boxWidget->PlaceWidget();
iren->Initialize();
iren->Start();
reader->Delete();
iren->Delete();
return 0;
}

2519

被折叠的 条评论
为什么被折叠?



