You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
228 lines
6.6 KiB
C
228 lines
6.6 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: vtkIterativeClosestPointTransform.h
|
||
|
|
||
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
||
|
All rights reserved.
|
||
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
||
|
|
||
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
||
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||
|
PURPOSE. See the above copyright notice for more information.
|
||
|
|
||
|
=========================================================================*/
|
||
|
|
||
|
/**
|
||
|
* @class vtkIterativeClosestPointTransform
|
||
|
* @brief Implementation of the ICP algorithm.
|
||
|
*
|
||
|
* Match two surfaces using the iterative closest point (ICP) algorithm.
|
||
|
* The core of the algorithm is to match each vertex in one surface with
|
||
|
* the closest surface point on the other, then apply the transformation
|
||
|
* that modify one surface to best match the other (in a least square sense).
|
||
|
* This has to be iterated to get proper convergence of the surfaces.
|
||
|
* @attention
|
||
|
* Use vtkTransformPolyDataFilter to apply the resulting ICP transform to
|
||
|
* your data. You might also set it to your actor's user transform.
|
||
|
* @attention
|
||
|
* This class makes use of vtkLandmarkTransform internally to compute the
|
||
|
* best fit. Use the GetLandmarkTransform member to get a pointer to that
|
||
|
* transform and set its parameters. You might, for example, constrain the
|
||
|
* number of degrees of freedom of the solution (i.e. rigid body, similarity,
|
||
|
* etc.) by checking the vtkLandmarkTransform documentation for its SetMode
|
||
|
* member.
|
||
|
* @sa
|
||
|
* vtkLandmarkTransform
|
||
|
*/
|
||
|
|
||
|
#ifndef vtkIterativeClosestPointTransform_h
|
||
|
#define vtkIterativeClosestPointTransform_h
|
||
|
|
||
|
#include "vtkCommonDataModelModule.h" // For export macro
|
||
|
#include "vtkLinearTransform.h"
|
||
|
|
||
|
#define VTK_ICP_MODE_RMS 0
|
||
|
#define VTK_ICP_MODE_AV 1
|
||
|
|
||
|
class vtkCellLocator;
|
||
|
class vtkLandmarkTransform;
|
||
|
class vtkDataSet;
|
||
|
|
||
|
class VTKCOMMONDATAMODEL_EXPORT vtkIterativeClosestPointTransform : public vtkLinearTransform
|
||
|
{
|
||
|
public:
|
||
|
static vtkIterativeClosestPointTransform* New();
|
||
|
vtkTypeMacro(vtkIterativeClosestPointTransform, vtkLinearTransform);
|
||
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Specify the source and target data sets.
|
||
|
*/
|
||
|
void SetSource(vtkDataSet* source);
|
||
|
void SetTarget(vtkDataSet* target);
|
||
|
vtkGetObjectMacro(Source, vtkDataSet);
|
||
|
vtkGetObjectMacro(Target, vtkDataSet);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set/Get a spatial locator for speeding up the search process.
|
||
|
* An instance of vtkCellLocator is used by default.
|
||
|
*/
|
||
|
void SetLocator(vtkCellLocator* locator);
|
||
|
vtkGetObjectMacro(Locator, vtkCellLocator);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set/Get the maximum number of iterations. Default is 50.
|
||
|
*/
|
||
|
vtkSetMacro(MaximumNumberOfIterations, int);
|
||
|
vtkGetMacro(MaximumNumberOfIterations, int);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Get the number of iterations since the last update
|
||
|
*/
|
||
|
vtkGetMacro(NumberOfIterations, int);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Force the algorithm to check the mean distance between two iterations.
|
||
|
* Default is Off.
|
||
|
*/
|
||
|
vtkSetMacro(CheckMeanDistance, vtkTypeBool);
|
||
|
vtkGetMacro(CheckMeanDistance, vtkTypeBool);
|
||
|
vtkBooleanMacro(CheckMeanDistance, vtkTypeBool);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Specify the mean distance mode. This mode expresses how the mean
|
||
|
* distance is computed. The RMS mode is the square root of the average
|
||
|
* of the sum of squares of the closest point distances. The Absolute
|
||
|
* Value mode is the mean of the sum of absolute values of the closest
|
||
|
* point distances. The default is VTK_ICP_MODE_RMS
|
||
|
*/
|
||
|
vtkSetClampMacro(MeanDistanceMode, int, VTK_ICP_MODE_RMS, VTK_ICP_MODE_AV);
|
||
|
vtkGetMacro(MeanDistanceMode, int);
|
||
|
void SetMeanDistanceModeToRMS() { this->SetMeanDistanceMode(VTK_ICP_MODE_RMS); }
|
||
|
void SetMeanDistanceModeToAbsoluteValue() { this->SetMeanDistanceMode(VTK_ICP_MODE_AV); }
|
||
|
const char* GetMeanDistanceModeAsString();
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set/Get the maximum mean distance between two iteration. If the mean
|
||
|
* distance is lower than this, the convergence stops. The default
|
||
|
* is 0.01.
|
||
|
*/
|
||
|
vtkSetMacro(MaximumMeanDistance, double);
|
||
|
vtkGetMacro(MaximumMeanDistance, double);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Get the mean distance between the last two iterations.
|
||
|
*/
|
||
|
vtkGetMacro(MeanDistance, double);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set/Get the maximum number of landmarks sampled in your dataset.
|
||
|
* If your dataset is dense, then you will typically not need all the
|
||
|
* points to compute the ICP transform. The default is 200.
|
||
|
*/
|
||
|
vtkSetMacro(MaximumNumberOfLandmarks, int);
|
||
|
vtkGetMacro(MaximumNumberOfLandmarks, int);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Starts the process by translating source centroid to target centroid.
|
||
|
* The default is Off.
|
||
|
*/
|
||
|
vtkSetMacro(StartByMatchingCentroids, vtkTypeBool);
|
||
|
vtkGetMacro(StartByMatchingCentroids, vtkTypeBool);
|
||
|
vtkBooleanMacro(StartByMatchingCentroids, vtkTypeBool);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Get the internal landmark transform. Use it to constrain the number of
|
||
|
* degrees of freedom of the solution (i.e. rigid body, similarity, etc.).
|
||
|
*/
|
||
|
vtkGetObjectMacro(LandmarkTransform, vtkLandmarkTransform);
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Invert the transformation. This is done by switching the
|
||
|
* source and target.
|
||
|
*/
|
||
|
void Inverse() override;
|
||
|
|
||
|
/**
|
||
|
* Make another transform of the same type.
|
||
|
*/
|
||
|
vtkAbstractTransform* MakeTransform() override;
|
||
|
|
||
|
protected:
|
||
|
//@{
|
||
|
/**
|
||
|
* Release source and target
|
||
|
*/
|
||
|
void ReleaseSource(void);
|
||
|
void ReleaseTarget(void);
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Release locator
|
||
|
*/
|
||
|
void ReleaseLocator(void);
|
||
|
|
||
|
/**
|
||
|
* Create default locator. Used to create one when none is specified.
|
||
|
*/
|
||
|
void CreateDefaultLocator(void);
|
||
|
|
||
|
/**
|
||
|
* Get the MTime of this object also considering the locator.
|
||
|
*/
|
||
|
vtkMTimeType GetMTime() override;
|
||
|
|
||
|
vtkIterativeClosestPointTransform();
|
||
|
~vtkIterativeClosestPointTransform() override;
|
||
|
|
||
|
void InternalUpdate() override;
|
||
|
|
||
|
/**
|
||
|
* This method does no type checking, use DeepCopy instead.
|
||
|
*/
|
||
|
void InternalDeepCopy(vtkAbstractTransform* transform) override;
|
||
|
|
||
|
vtkDataSet* Source;
|
||
|
vtkDataSet* Target;
|
||
|
vtkCellLocator* Locator;
|
||
|
int MaximumNumberOfIterations;
|
||
|
vtkTypeBool CheckMeanDistance;
|
||
|
int MeanDistanceMode;
|
||
|
double MaximumMeanDistance;
|
||
|
int MaximumNumberOfLandmarks;
|
||
|
vtkTypeBool StartByMatchingCentroids;
|
||
|
|
||
|
int NumberOfIterations;
|
||
|
double MeanDistance;
|
||
|
vtkLandmarkTransform* LandmarkTransform;
|
||
|
|
||
|
private:
|
||
|
vtkIterativeClosestPointTransform(const vtkIterativeClosestPointTransform&) = delete;
|
||
|
void operator=(const vtkIterativeClosestPointTransform&) = delete;
|
||
|
};
|
||
|
|
||
|
#endif
|