VTK体积&表面积测量

    系统:Win8.1

    VTK:6.2.0

    Qt:5.2.1

    在VTK中计算体积和面积的主要类为vtkMassProperties。不管是是网上还是VTK源码,都缺乏完整的实例,在此将分享一些简单的实例。

1 结构化对象——圆

1.1 代码

vtkSmartPointer< vtkSphereSource > sphereSource = vtkSmartPointer<vtkSphereSource>::New();
sphereSource->SetRadius( 100 );
sphereSource->SetPhiResolution( 21 );
sphereSource->SetThetaResolution( 41 );
sphereSource->Update();

vtkSmartPointer< vtkTriangleFilter > triangleFilter= vtkSmartPointer< vtkTriangleFilter >::New();
triangleFilter->SetInputData( sphereSource->GetOutput() );
triangleFilter->Update();

vtkSmartPointer< vtkMassProperties > polygonProperties = vtkSmartPointer< vtkMassProperties >::New();
polygonProperties->SetInputData( triangleFilter->GetOutput());
polygonProperties->Update();

double area = polygonProperties->GetSurfaceArea();
double vol = polygonProperties->GetVolume();

qDebug() << "Data area is:" << QString::number(area) << "Data volume is: " << QString::number( vol );

1.2 结果分析    

执行上述代码得到的球体表面和体积为:

Data area is: "125031" Data volume is:  "4.14673e+06" 

    球体表面积和体积的公式,计算半径为100的球体的表面积和体积分别为125600和4.188e+06。

    将上述值总结进下面的表格中

  表面积 体积
VTK测量值 125031 4.14673e+06
理论值 125600 4.188e+06
比率 0.9955 0.9901
    由上表可知,VTK测量值是低于理论值的,但是都比较接近于理论值。

1.3 可能遇到的问题

    如果在计算表面积和体积之前sphereSource没有先Update(),将会提示如下错误:

ERROR: In E:\VTK\VTK-6.2.0\Filters\Core\vtkMassProperties.cxx, line 80
vtkMassProperties (0000006172894470): No data to measure...!
解决方法:

sphereSource->Update();

2 非结构化对象

    在三维重建之后(例如面绘制),希望能够测得重建对象的体积和表面积,这时候也可以通过vtkMassProperties来实现。下面是其主要代码:

if ( !m_pvtkTriangleFilter )
	m_pvtkTriangleFilter = vtkTriangleFilter::New();

if ( m_pvtkContourFilter3D ) {
	m_pvtkTriangleFilter->SetInputData( m_pvtkContourFilter3D->GetOutput() );
}
else if ( m_pvtkMarchingCubes ) {
	m_pvtkTriangleFilter->SetInputData( m_pvtkMarchingCubes->GetOutput() );
}

m_pvtkTriangleFilter->Update();

if ( !m_pvtkMassProperties )
	m_pvtkMassProperties = vtkMassProperties::New();
m_pvtkMassProperties->SetInputData( m_pvtkTriangleFilter->GetOutput());
m_pvtkMassProperties->Update();

double area = m_pvtkMassProperties->GetSurfaceArea();
double volume = m_pvtkMassProperties->GetVolume();

    为了使得测量效果更加准确,可以使用vtkSmoothPolyDataFilter先对m_pvtkContourFilter3D和m_pvtkMarchingCubes进行平滑[2]。

参考资料

[1]vtk计算Polydata的面积和体积

[2]SmoothPolyDataFilter

[3]VTK-users-How to measure the volume from the many objects separated

你可能感兴趣的:(VTK体积&表面积测量)