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()
相关推荐
L@ncor5 分钟前
第六章可能出现的问题:依赖冲突与成本乘法
python·依赖管理·langgraph·agentscope·避坑
AC赳赳老秦5 分钟前
财报附注表格精准提取:OpenClaw 从 PDF 年报附注挖掘隐藏明细,补齐财务分析维度
java·汇编·c++·python·青少年编程·deepseek·openclaw
小小张说故事9 分钟前
CatBoost 入门指南:类别特征为什么不用 One-Hot?Python 实战与 5 个坑
python·机器学习
卷无止境32 分钟前
WebGIS生态全景丨从浏览器里的地图到背后的空间数据库
后端·python
Y38153266238 分钟前
竞品上新监控:用搜索 API 盯住对手发布了什么新功能
python·搜索引擎
benchmark_cc38 分钟前
如何设计一个 Python 实时行情获取程序?从轮询、数据处理到量化策略接入
python·数据分析·pandas·量化交易·股票数据·quantdash
Metaphor6921 小时前
Python 实现 Word/TXT 互转:附完整代码
python·word·格式转换·txt
柒和远方1 小时前
DocResearch 项目面试:把每个模块讲明白,而不是背术语
python·llm·agent
信誓旦旦的程序猿1 小时前
【Python 量化取数指南 #13】Python 把行情落库:sqlite 一键存,回测随用随取
java·python·股票数据api·股票数据·股票数据api接口·股票api数据接口·股票量化数据api
LensonYuan1 小时前
Cursor状态栏一键切换OpenAI API Key
人工智能·python·cursor