Source code for sksurgerytrackervisualisation.algorithms.icp

"""
Algorithms for doing Iterative Closest Point
"""
from vtk import vtkIterativeClosestPointTransform, vtkCellLocator, vtkMatrix4x4# pylint: disable=no-name-in-module

[docs]def vtk_icp(source, target, locator=None, max_iterations=100, max_landmarks=1000, check_mean_distance=False, maximum_mean_distance=0.001): """ An iterative closest point algorithm, delegating to vtk. Target is a point set, source is a point cloud """ if source.GetNumberOfCells() == 0: raise ValueError("vtk_icp needs a polydata surface", source.GetNumberOfCells()) vtk_icp_transform = vtkIterativeClosestPointTransform() vtk_icp_transform.GetLandmarkTransform().SetModeToRigidBody() vtk_icp_transform.SetSource(target) vtk_icp_transform.SetTarget(source) if locator is None: locator = vtkCellLocator() locator.SetDataSet(source) locator.SetNumberOfCellsPerBucket(1) locator.BuildLocator() vtk_icp_transform.SetLocator(locator) vtk_icp_transform.SetMaximumNumberOfIterations(max_iterations) vtk_icp_transform.SetMaximumNumberOfLandmarks(max_landmarks) vtk_icp_transform.SetCheckMeanDistance(check_mean_distance) vtk_icp_transform.SetMaximumMeanDistance(maximum_mean_distance) vtk_icp_transform.Modified() vtk_icp_transform.Update() result = vtkMatrix4x4() result = vtk_icp_transform.GetMatrix() inverted = vtkMatrix4x4() vtkMatrix4x4.Invert(result, inverted) return inverted