點雲/網格模型的體積計算
-
點雲體積計算
有時用激光掃描設備掃描零件或者用無人機進行測量後會想知道它們的體積。比如下面的土堆:
如果掃描得到的數據是一系列三維點雲,那麽體積就比較難求,因為如何定義物體的邊界比較困難。一種方法是提取三維點雲的凸殼(包絡體),然後再進行計算(當存在孔、洞時情況就很復雜了)。還有一種簡便的估算方法如下圖所示,將2.5D點雲底面劃分成離散的網格,計算每個網格對應單元的體積並相加求和。
point cloud dimension: 1.5D – function values along a line 2D – positions in the plane 2.5D – function values in the plane 3D – positions in 3D nD – multi-modal data
CloudCompare軟件中提供了計算2.5D點雲體積的功能:
導入PCD格式的點雲,其體積大概為1(在XYZ方向分別生成0-1的隨機數,一共200個隨機點):
在體積計算界面中定義地面(Ground)及頂面(Ceil):這裏地面選為常量,值為0;頂面選為點雲,空單元(不包含數據點)不參與體積計算,這裏將其選為leave empty。網格劃分步長step不能選的太大或太小,選的太小將會有很多單元成為空單元,選的太大會出現較大的計算誤差。下圖可以看出步長設的太小,導致Matching cell為0,即全是空單元,因此計算出的體積也為零,顯然不符合實際情況:
設置合理的步長後點擊Update進行計算,可以看到估算出的點雲體積為1.311接近1:
-
網格模型體積計算
在VTK中可以使用vtkMassProperties類來計算模型的體積和表面積(The general assumption here is that the model is of closed surface. Currently only triangles are processed. Use vtkTriangleFilter to convert any strips or polygons to triangles)。因為只能處理三角面片的polydata,需要在pipline中前置vtkTriangleFilter將其他網格類型轉換成三角網格類型。下面代碼計算Solidworks中導出的STL網格模型的體積和表面積:
#!/usr/bin/env python import vtk filename = "C:\Users\Administrator\Desktop\part.stl" reader = vtk.vtkSTLReader() reader.SetFileName(filename) reader.Update() polydata = reader.GetOutput() mass = vtk.vtkMassProperties() mass.SetInputData(polydata) print "Surface = ", mass.GetSurfaceArea() print "Volume = ", mass.GetVolume()
Solidworks原始CAD模型導出成stl文件時由於精度限制,因此存在一定的誤差。在CloudCompare軟件中也可以很方便的對網格模型進行體積、表面積測量:
參考:
Algorithm for calculating the volume of the part of point cloud—stackoverflow
How Pix4Dmapper calculates the Volume?
Compute 2.5D volume
CloudCompare - 3D point cloud and mesh processing software
Volume estimation
VTK體積&表面積測量
點雲/網格模型的體積計算