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()
相关推荐
做怪小疯子17 小时前
华为笔试0429
python·numpy
Warson_L17 小时前
Dictionary
python
郑寿昌18 小时前
UE5与UE6在Lumen和Nanite的差异解析
游戏引擎·图形渲染·着色器
寒山李白19 小时前
解决 python-docx 生成的 Word 文档打开时弹出“无法读取内容“警告
python·word·wps·文档·docx·qoder
2401_8323655220 小时前
JavaScript中rest参数(...args)取代arguments的优势
jvm·数据库·python
Sirius.z20 小时前
第J3周:DenseNet121算法详解
python
2301_7796224120 小时前
Go语言怎么用信号量控制并发_Go语言semaphore信号量教程【入门】
jvm·数据库·python
2301_7662834420 小时前
c++如何将控制台输出保存到文件_cout重定向到txt【详解】
jvm·数据库·python
小康小小涵1 天前
基于ESP32S3实现无人机RID模块底层源码编译
linux·开发语言·python
lzjava20241 天前
Python的函数
开发语言·python