首页 > 其他分享 >VTK_Learning_图形基本操作进阶_模型区率计算

VTK_Learning_图形基本操作进阶_模型区率计算

时间:2022-12-30 13:06:39浏览次数:43  
标签:lut curvaturesFilter 进阶 VTK vtkSmartPointer 曲率 New 基本操作 include


1.曲率计算

曲率时曲面弯曲程度的一种度量,是几何体的一种重要的局部特征。如下图所示:

VTK_Learning_图形基本操作进阶_模型区率计算_scala

要计算曲面上给定点M的曲率,考虑经过M的法线的一个平面与曲面相交,得到一条二维曲面,称之为曲面在M点的一条法截线。经过M点法向量的曲面可以任意旋转,即可得到任意多条法截面,如上图所示。每一条法截线都会对应一个曲率,取具有最大曲率和最小曲率的两条法截线为主法截线,例如上图中的C1,C2;其对应的曲率分别记为k1,k2;称为主曲率;高斯曲率等于主曲率的乘积即k1*k2;平均曲率等于主曲率k1,k2的平均值,即(k1+k2)/2;当然,这只是曲率的直观几何解释,并没有给出具体的计算公式。这个公式高中就接触过:

VTK_Learning_图形基本操作进阶_模型区率计算_数据_02

vtk中vtkCurvatures类实现了四种计算网格模型点曲率的计算方法。该类接受一个vtkPolyData数据,经计算得到的曲率数据作为网格模型的点的属性数据存入返回的vtkPolyData中

下例实现了一个网格模型的曲率计算,并通过颜色映射表来显示模型的表面曲率:

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);

#include <vtkSmartPointer.h>
#include <vtkPolyDataReader.h>
#include <vtkCurvatures.h>
#include <vtkLookupTable.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkScalarBarActor.h>
#include <vtkPointData.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>

int main()
{
vtkSmartPointer<vtkPolyDataReader> reader =
vtkSmartPointer<vtkPolyDataReader>::New();
reader->SetFileName("fran_cut.vtk");
reader->Update();

vtkSmartPointer<vtkCurvatures> curvaturesFilter =
vtkSmartPointer<vtkCurvatures>::New();
curvaturesFilter->SetInputConnection(reader->GetOutputPort());
//curvaturesFilter->SetCurvatureTypeToMinimum(); //最小曲率
curvaturesFilter->SetCurvatureTypeToMaximum(); //最大曲率
//curvaturesFilter->SetCurvatureTypeToGaussian();//高斯曲率
//curvaturesFilter->SetCurvatureTypeToMean(); //平均曲率
curvaturesFilter->Update();

double scalarRange[2];
curvaturesFilter->GetOutput()->GetScalarRange(scalarRange);
//建立查找表 做颜色映射
vtkSmartPointer<vtkLookupTable> lut =
vtkSmartPointer<vtkLookupTable>::New();
lut->SetHueRange(0.0, 0.6);
lut->SetAlphaRange(1.0, 1.0);
lut->SetValueRange(1.0, 1.0);
lut->SetSaturationRange(1.0, 1.0);
lut->SetNumberOfTableValues(256);
lut->SetRange(scalarRange);
lut->Build();
///
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(curvaturesFilter->GetOutput());
mapper->SetLookupTable(lut);
mapper->SetScalarRange(scalarRange);

vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);

vtkSmartPointer<vtkScalarBarActor> scalarBar =
vtkSmartPointer<vtkScalarBarActor>::New();
scalarBar->SetLookupTable(mapper->GetLookupTable());
scalarBar->SetTitle(curvaturesFilter->GetOutput()->GetPointData()->GetScalars()->GetName());
scalarBar->SetNumberOfLabels(5); //设置5个标签

vtkSmartPointer<vtkRenderer> render =
vtkSmartPointer<vtkRenderer>::New();
render->AddActor(actor);
render->AddActor2D(scalarBar);
render->SetBackground(0, 0, 0);

vtkSmartPointer<vtkRenderWindow> rw =
vtkSmartPointer<vtkRenderWindow>::New();
rw->AddRenderer(render);
rw->SetSize(640, 480);
rw->SetWindowName("Calculating PolyData Curvature");

vtkSmartPointer<vtkRenderWindowInteractor> rwi =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
rwi->SetRenderWindow(rw);
rwi->Initialize();
rwi->Start();
return 0;
}

首先读入一个vtkPolyData人脸模型数据,作为vtkCurvatures的输入,并调用SetCurvatureTypeToMaximum()函数计算最大曲率,此外我们还可以定义最小曲率,高斯曲率,平均曲率。当然,四种曲率允许同时计算。
在内部计算完曲率数据后,将其作为输出的vtkPolyData点的属性数据。保存属性数据时,四种曲率数据分别对应属性名字为Minimum_Curvature/Maximum_Curvature/Gauss_Curvature/Mean_Curvature,因此可以通过属性名字获取相应的曲率数据。例如要获得高斯曲率数据,可调用:

vtkDoubleArray *gauss = static_cast<vtkDoubleArray*>(
curvaturesFilter->GetOutput()->GetpointData()->GetArray("Gauss_Curvature"));

为了能够在模型上显示曲率属性数据,采用颜色映射来显示。定义了一个256色的VTKLookupTable对象,并设置了曲率数据的范围。

然后将改颜色映射表添加到vtkPolyDataMapper中。

最后,我用到了一个新的VTKScalarBarActor类,该类支持一个颜色映射表转换为一个Actor对象,将颜色表以图形的形式显示,并支持设置图形相应的名字和翔实数据Label个数。最后显示即可。

VTK_Learning_图形基本操作进阶_模型区率计算_vtk去曲率_03

标签:lut,curvaturesFilter,进阶,VTK,vtkSmartPointer,曲率,New,基本操作,include
From: https://blog.51cto.com/u_15926338/5980076

相关文章

  • VTK_Learning_图形基本操作进阶_连通区域分析
    1.连通区域分析许多图形数据中,并非只包含一个对象(连通区域)。而在处理这些图形数据时,有时需要对每一个对象单独处理或者让其单独显示。比如,利用MarchingCube方法提取三维图像......
  • VTK_Learning_交互部件_测量类Widget的应用
    1.与测量类相关的主要Widget与测量类相关的主要Widget如下:vtkDistanceWidget:用于在二维平面上测量两点之间的距离。vtkAngleWidget:用于在平面的角度测量。vtkBiDimensiona......
  • VTK_Learning_交互与Widget_观察者/命令模式
    1.前言一个强大的可视化系统不仅需要强大的数据处理能力,也需要方便易用的交互功能。图形处理软件ParaView(hhttp://www.paraview.org)、德国癌症研究中心研发的MITK(http://www......
  • VTK_Learning_图像二值化_阈值法
    1.阈值法实现图像二值化操作二值图像和label图像是图像分割中经常用到的两种图像。二值图像的每个像素只有两种可能的取值,例如0或者255。通常0代表图像的背景,而255代码图像......
  • VTK_Learning_交互部件_Widget应用综述
    1.交互器样式遇到的难题交互器样式(如vtkInteractorStyleImage)主要是根据不同的键盘、鼠标等消息来控制相机(vtkCamera)/Actor等相关参数,从而达到了交互的目的!然而,在渲染场......
  • VTK_Learning_交互与拾取_点拾取
    1.拾取选择拾取是人机交互过程的一个重要功能。一个最经典的例子就是,在玩3D游戏时,场景中可能会存在多个角色,有时需要用鼠标来选择所要控制的角色,这就要用到拾取功能。另外......
  • VTK_Learning_体绘制_固定点光线投影体绘制与GPU加速光线投影体绘制
    1.固定点光线投影算法vtkFixedPointVolumeRayCastMapper是一个较好的vtkVolumeRayCastMapper的替代者。该类能够实现基于Alpha合成的体绘制方法和最大密度投影体绘制方法,能......
  • VTK_Learning_图像统计_灰度直方图计算_彩色直方图计算
    1.灰度图像直方图直方图统计是图像处理中的一个非常重要的操作。VTK中实现直方图统计功能的filter是vtkImageAccumulate。其将每个组分的数值范围划分为离散的间隔,然后统计......
  • VTK_Learning_图像信息的访问与修改(vtkImageData)(vtkImageChangeInformation)
    1.利用vtkImageData实现图像信息的访问与修改数字图像文件内容由两个部分组成:图像头信息和数据。图像头信息定义了图像的基本信息,主要包括起点位置(Origin),像素间隔(space)和维......
  • VTK_Learning_图像显示(vtkImageViewer2 & vtkImageActor)
    1.vtkImageViewer2用于图像显示在VTK早期版本中,提供了vtkImageViewer类来显示图像。随着版本的发展,目前vtkImageViewer2代替了vtkImageViewer进行图像显示。vtkImageViewer2......