一:主要的知识点
1、说明
本文只是教程内容的一小段,因博客字数限制,故进行拆分。主教程链接:vtk教程------逐行解析官网所有Python示例-CSDN博客
2、知识点纪要
本段代码主要涉及的有①ICP配算法的运用,②运用ICP的配准矩阵
二:代码及注释
python
import vtkmodules.vtkRenderingOpenGL2
import vtkmodules.vtkInteractionStyle
from vtkmodules.vtkCommonCore import vtkPoints
from vtkmodules.vtkCommonDataModel import vtkCellArray, vtkPolyData, vtkIterativeClosestPointTransform
from vtkmodules.vtkFiltersGeneral import vtkTransformPolyDataFilter
# from vtkmodules.vtkFiltersSources import
def main():
"""
原文写法
sourcePoints = vtkPoints()
sourceVertices = vtkCellArray()
sp_id = sourcePoints.InsertNextPoint(1.0, 0.1, 0.0) # 返回为0
sourceVertices.InsertNextCell(1)
sourceVertices.InsertCellPoint(sp_id)
sp_id = sourcePoints.InsertNextPoint(0.1, 1.1, 0.0) # 返回为1
sourceVertices.InsertNextCell(1)
sourceVertices.InsertCellPoint(sp_id)
sp_id = sourcePoints.InsertNextPoint(0.0, 0.1, 1.0) # 返回为2
sourceVertices.InsertNextCell(1)
sourceVertices.InsertCellPoint(sp_id)
source = vtkPolyData()
source.SetPoints(sourcePoints)
source.SetVerts(sourceVertices)
我觉得这种写法与一般示例的写法出入较大,在这里重写
"""
sourcePoints = vtkPoints()
sourcePoints.InsertNextPoint(1.0, 0.1, 0.0)
sourcePoints.InsertNextPoint(0.1, 1.1, 0.0)
sourcePoints.InsertNextPoint(0.0, 0.1, 1.0)
sourceCells = vtkCellArray()
sourceCells.InsertNextCell(1, [0])
sourceCells.InsertNextCell(1, [1])
sourceCells.InsertNextCell(1, [2])
source = vtkPolyData()
source.SetPoints(sourcePoints)
source.SetVerts(sourceCells)
pointCount = 3
for index in range(pointCount):
point = [0, 0, 0]
sourcePoints.GetPoint(index, point)
print("source point[%s]=%s" % (index, point))
# target_points。目标点位
targetPoints = vtkPoints()
targetPoints.InsertNextPoint(1, 0, 0)
targetPoints.InsertNextPoint(0, 1, 0)
targetPoints.InsertNextPoint(0, 0, 1)
targetCells = vtkCellArray()
targetCells.InsertNextCell(1, [0])
targetCells.InsertNextCell(1, [1])
targetCells.InsertNextCell(1, [2])
target = vtkPolyData()
target.SetPoints(targetPoints)
target.SetVerts(targetCells)
pointCount = 3
for index in range(pointCount):
point = [0, 0, 0]
targetPoints.GetPoint(index, point)
print("target point[%s]=%s" % (index, point))
# 构建icp
icp = vtkIterativeClosestPointTransform()
icp.SetSource(source)
icp.SetTarget(target)
icp.GetLandmarkTransform().SetModeToRigidBody() # 设为刚体,只能旋转和平移,不能缩放
icp.SetMaximumNumberOfIterations(20) # 设置最大迭代次数为20
icp.StartByMatchingCentroidsOn() # 开启ICP算法的质心预匹配步骤,它会在第一次迭代时,先应用一个平移变换,将源点云的质心移动到目标点云的质心位置
icp.Modified() # 通知 VTK 管道,这个对象(icp 变换对象)的参数已被修改
icp.Update()
"""
vtkTransformPolyDataFilter 将一个 vtkPolyData 数据集应用几何变换,然后生成一个新的、已变换的 vtkPolyData 对象
下面一段代码的含义是指将source乘以ipc得到的4x4配准矩阵
"""
icpTransformFilter = vtkTransformPolyDataFilter()
icpTransformFilter.SetInputData(source)
icpTransformFilter.SetTransform(icp)
icpTransformFilter.Update()
transformedSource = icpTransformFilter.GetOutput()
# ============ display transformed points ==============
pointCount = 3
for index in range(pointCount):
point = [0, 0, 0]
transformedSource.GetPoint(index, point)
print("transformed source point[%s]=%s" % (index, point))
if __name__ == '__main__':
main()