VTK可视化管线是完成VTK应用程序这道菜的基本步骤,VTK数据结构就是每一道菜的基本原料
基本数据结构
可视化数据的基本特点:
- 离散型:点与点之间的值是不可知的,要得到该值,需要通过插值的方式获取
- 数据具有规则或不规则的结构
对于规则的结构数据,只需要存储起始点, 相邻两点之间的间隔和总数即可保存完整的信息
不规则的数据结构在数据表达方面更加自由细致灵活 - 数据具有维度
拓扑维度
数据对象和数据集
- 数据对象
数据一般以数据对象形式表现
只有当数据对象被组织册灰姑娘一种结构后,才能被VTK算法处理
vtkDataObject 根据具体可视化数据选用
企业微信截图_16748939564419.png
-
数据集
vtkDataSet 将数据对象组织成一种结构并且赋予相应的属性值,就形成了数据集.
vtkDataSet 由拓扑结构和几何结构组成:
点数据定义的坐标点形成了几何结构,点数据的链接形成单元数据,由单元数据形成数据集的拓扑结构
企业微信截图_16749714227221.png -
单元
一系列有序的点按照指定类型连接所定义的结构就是单元,单元是VTK的基础
单元类型分为线性单元和非线性单元
线性单元.png
非线性单元.png
- 属性数据
主要用于描述数据集的属性特征,对数据集的可视化实质就是对属性数据的可视化
分为标量数据(指标是数据的大小,最普遍的可视化数据),矢量数据(有大小有方向),张量数据
数据集
vtkImageData(非常重要) :按照规则排列在矩形方格中的点和单元的集合 常用于医学图像
vtkPolyData:多边形数据集,该类由以下数据组成,并都是通过vtkDataArray(建立VTK数据对象的基础)形式存储,使用时应指定元组大小
- 几何数据 vtkPoints
- 拓扑数据 vtkCellArray
- 属性数据 vtkPointData vtkCellData vtkFieldData
实现三角形:
#include <iostream>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkActor.h>
#include <vtkConeSource.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkLight.h>
#include <vtkCamera.h>
#include <vtkActor2D.h>
#include <vtkPlaneSource.h>
#include <vtkAxesActor.h>
#include <vtkTransform.h>
#include <vtkTransformFilter.h>
#include <vtkPoints.h>
#include <vtkLine.h>
#include <vtkCellArray.h>
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
using namespace std;
int main()
{
/// <summary>
/// 创建坐标点,几何数据
/// </summary>
/// <returns></returns>
vtkSmartPointer<vtkPoints> source = vtkSmartPointer<vtkPoints>::New();
source->InsertNextPoint(1.0, 0.0, 0.0);
source->InsertNextPoint(0.0, 1.0, 0.0);
source->InsertNextPoint(0.0, 0.0, 0.0);
/// <summary>
/// 连接点,实现拓扑结构
/// </summary>
/// <returns></returns>
vtkSmartPointer<vtkLine> line0 = vtkSmartPointer<vtkLine>::New();
line0->GetPointIds()->SetId(0, 0);
line0->GetPointIds()->SetId(1, 1);
vtkSmartPointer<vtkLine> line1 = vtkSmartPointer<vtkLine>::New();
line1->GetPointIds()->SetId(0, 1);
line1->GetPointIds()->SetId(1, 2);
vtkSmartPointer<vtkLine> line2 = vtkSmartPointer<vtkLine>::New();
line2->GetPointIds()->SetId(0, 2);
line2->GetPointIds()->SetId(1, 0);
///创建单元数组
vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
lines->InsertNextCell(line0);
lines->InsertNextCell(line1);
lines->InsertNextCell(line2);
//以上数据组合成一个vtkPolyData
vtkSmartPointer<vtkPolyData> polyData =
vtkSmartPointer<vtkPolyData>::New();
polyData->SetPoints(source);
polyData->SetLines(lines);
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(polyData);
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
//vtkSmartPointer<vtkAxesActor> axesActor =
// vtkSmartPointer<vtkAxesActor>::New();
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
//renderer->AddActor(axesActor);
renderer->SetBackground(0, 0, 0);
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
renderer->ResetCamera();
renderWindow->Render();
renderWindowInteractor->Start();
return 0;
}
VTK数据的读写
数据的获取方式
- 生成模型,然后处理模型数据
- 从外部存储介质里导入相关的数据文件,步骤如下:
- 实例化Reader对象
- 指定要读取的文件名
- 调用Update()方法促使管线执行
vtkImageData
vtkDicomImageReader用于读取dicom图像,但是不支持多帧图像 ITK封装了GDCM对DICOM读写
对于序列图像文件,可以采用SetFileNames来设置多个图像文件名,由多个二维图像组成三维