IterativeClosestPoints icp配准矩阵

一:主要的知识点

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()
相关推荐
vx_BS8133013 小时前
【直接可用源码免费送】计算机毕业设计精选项目03574基于Python的网上商城管理系统设计与实现:Java/PHP/Python/C#小程序、单片机、成品+文档源码支持定制
java·python·课程设计
gzxx2007sddx13 小时前
windows vnpy运行过程及问题记录
python·量化·vnpy
算法_小学生13 小时前
LeetCode 热题 100(分享最简单易懂的Python代码!)
python·算法·leetcode
230万光年的思念13 小时前
【无标题】
python
shengli72214 小时前
机器学习与人工智能
jvm·数据库·python
2301_7657031414 小时前
Python迭代器(Iterator)揭秘:for循环背后的故事
jvm·数据库·python
追风少年ii14 小时前
多组学扩展---分子对接pyrosetta
python·数据分析·空间·单细胞
2301_8213696114 小时前
使用Python进行图像识别:CNN卷积神经网络实战
jvm·数据库·python
m0_5613596714 小时前
使用Kivy开发跨平台的移动应用
jvm·数据库·python
编程火箭车15 小时前
04.第一个 Python 程序:Hello World 从编写到运行全解析
python·python第一个程序·python入门报错解决·python新手教程·hello world 程序·python终端运行·pycharm运行代码