VTK 面绘制 重建

VTK 面绘制

  (2012-06-11 17:19:49)
标签: 

杂谈

分类: 图像处理(C )
操作系统: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;
}


VTK教程之十三 可视化基础算法-位移图  

2010-09-17 11:33:57|  分类: vtk|举报|字号 订阅

       位移图主要描绘矢量点沿着与其所在表面垂直正交方向的运动,是一种可视化矢量数据的方法,广泛应用于用位移或应变矢量场描述物体运动的场合,如有限元分析位移、应力场的描述,经常采用这种方式,用位移图描述矢量数据在其表面上的运动形态时,常把矢量数据转化成标量数据,转换的方式采用矢量点的运动方向和表面的法向量两个矢量点乘,得到矢量点的标量值,如果标量值为正,表示为正位移(矢量的运动方向和法向量方向一致),如果为负,表示为负位移(矢量点的运动方向和法向量的方向相反),转化为标量的方法如下图所示:

图中矢量V表示矢量点的运动方向,N表示矢量点在表面的法向量。

下面给出位移图的示例程序。

#include "stdafx.h"

#include <vtkSmartPointer.h>

#include <vtkVolume16Reader.h>

#include <vtkMarchingCubes.h>

#include <vtkVectorNorm.h>

#include <vtkPolyDataMapper.h>

#include <vtkActor.h>

#include "vtkCamera.h"

#include "vtkPolyData.h"

#include "vtkPolyDataMapper.h"

#include "vtkRenderWindow.h"

#include "vtkRenderWindowInteractor.h"

#include "vtkRenderer.h"

#include <vtkPolyDataReader.h>

#include <vtkPolyDataNormals.h>

#include <vtkWarpVector.h>

#include <vtkVectorDot.h>

#include <vtkProperty.h>

#include <vtkOutlineFilter.h>

#include <vtkLookupTable.h>

int _tmain(int argc, _TCHAR* argv[])

{

    int i;

    vtkSmartPointer<vtkPolyDataReader>pPolyRead=vtkPolyDataReader::New();

    //读取多边形数据

    pPolyRead->SetFileName("plate.vtk");

    //提取数据文件中的mode8这部分矢量数据

    pPolyRead->SetVectorsName("mode8");

    //使用矢量数据弯曲几何体

    vtkSmartPointer<vtkWarpVector>pWarpVec=vtkWarpVector::New();

    //设置矢量数据缩放的比例

    pWarpVec->SetScaleFactor(0.5);

    pWarpVec->SetInput(pPolyRead->GetOutput());

    //生成多边形数据的法线

    vtkSmartPointer<vtkPolyDataNormals>pNormal=vtkPolyDataNormals::New();

    pNormal->SetInput(pWarpVec->GetOutput());

    //点的矢量和其法线点乘,生成点的标量值

    vtkSmartPointer<vtkVectorDot>pVecDot=vtkVectorDot::New();

    //pVecDot->SetInput(pNormal->GetOutput());

    pVecDot->SetInputConnection(pNormal->GetOutputPort());

    //创建颜色表

    vtkSmartPointer<vtkLookupTable>pColorTable=vtkLookupTable::New();

    pColorTable->SetNumberOfColors(256);

    pColorTable->Build();

    for(i=0;i<128;i++){

pColorTable->SetTableValue(i,(128.0-i)/128.0,(128.0-i)/128.0,(128.0-i)/128.0);

    }

    for(i=128;i<256;i++){

       pColorTable->SetTableValue(i,(i-128.0)/128.0,(i-128.0)/128.0,(i-128.0)/128.0);

    }

    //创建映射器

    vtkSmartPointer<vtkPolyDataMapper>pMapper=vtkPolyDataMapper::New();

    //pMapper->SetInput((vtkPolyData *)pWarpVec->GetOutput());

    pMapper->SetInputConnection(pVecDot->GetOutputPort());

    pMapper->ScalarVisibilityOn();

    pMapper->SetLookupTable(pColorTable);

    pMapper->SetScalarRange(-1,1);//Rang[0],Rang[1]);

    vtkSmartPointer<vtkActor>pActor = vtkActor::New();

    pActor->SetMapper(pMapper);

    //pActor->GetProperty()->SetColor(1.0,0.0,0.0);

    //绘制没有发生变形以前的梁的几何形状

    //创建多边形数据的外轮廓线

    vtkSmartPointer<vtkOutlineFilter>pOutLine=vtkOutlineFilter::New();

    pOutLine->SetInput(pPolyRead->GetOutput());

    vtkSmartPointer<vtkPolyDataMapper>pOutlineMapper=vtkPolyDataMapper::New();

    pOutlineMapper->SetInput((vtkPolyData *)pOutLine->GetOutput());

    vtkSmartPointer<vtkActor>pOutlineActor=vtkActor::New();

    pOutlineActor->SetMapper(pOutlineMapper);

    pOutlineActor->GetProperty()->SetColor(0.0,0.0,1.0);

    pOutlineActor->GetProperty()->SetLineWidth(2.0);

    //绘制

    vtkSmartPointer<vtkRenderer>renderer = vtkRenderer::New();

    vtkSmartPointer<vtkRenderWindow>renWin = vtkRenderWindow::New();

    renWin->AddRenderer(renderer);

 

    vtkSmartPointer<vtkRenderWindowInteractor>iren = vtkRenderWindowInteractor::New();

    iren->SetRenderWindow(renWin);

    renderer->AddActor(pActor);

    renderer->AddActor(pOutlineActor);

    renderer->ResetCamera();

    renderer->SetBackground(1,1,1);

    renWin->SetSize(300,300);

    renWin->Render();

    iren->Start();

    return 0;

}

示例程序用vtkVectorDot类计算矢量点的标量值,并且设定了一个颜色映射表,用亮度表示位移变化比较大的区域,黑暗的地方表示位移变化小的区域,和几何体变形相比,位移图最大的特点是将矢量数据转化成标量数据,然后用颜色映射的方法表示位移的状态,本示例程序将几何体变形和位移图叠加,可以直观的进行对比,程序运行结果如图所示:

VTK教程之十三   位移图 - 陈恒 - 陈恒的博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值