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()
相关推荐
测试199821 分钟前
Jmeter接口自动化生成测试报告html格式详解
自动化测试·python·测试工具·jmeter·职场和发展·测试用例·接口测试
pjj1985421 分钟前
Hadoop-python中使用大数据
大数据·hadoop·python
小刘在重生~23 分钟前
Django|Excel 批量上传、Form/ModelForm 文件上传、Media 媒体文件配置
python·django·excel
威联通安全存储35 分钟前
TS-h1887XU-RP 在模具制造行业试模与改模数据场景的部署
python·制造
步行cgn39 分钟前
Spring Environment 详解:Spring Boot 配置管理的核心接口
spring boot·python·spring
Csvn42 分钟前
🐍 Day 12: 编码与字符集 — 告别乱码噩梦
后端·python
2601_9622838844 分钟前
Python 开发框架:Django、Flask和FastAPI
python·django·flask·fastapi·web开发
lzfshub1 小时前
Open-DIS Python发送DIS实体状态PDU:实现坦克炮塔与主炮部件参数
java·网络·python·dis
2601_962299881 小时前
排序,然后再使用
python·排序·列表·关键函数·装饰-排序-去装饰