Methods
Keypoint
ISS
Input
PointXYZ
PointXYZRGBA model
Output
PointXYZ
PointXYZRGBA model_keypoints
Notes
ISS + FPFH performs better than SIFT + FPFH
However, the registration can slip on the plane; there is no constraint on the tangent plane
PointOutT p; p.getVector3fMap () = ...
Algorithm
It computes an unnormalized covariance matrix centered at the query point (instead of the actual centroid/mean of all neighbors) and performs eigenvalue decomposition
The original algorithm proposed by the author assigns weights to each point inversely related to the point density (i.e. higher weight for sparse points), but in PCL the current implementation does not account for this (all points weighted equally).
The scatter matrix here is the second-order mixed moment about the origin (二阶混合原点矩).
SIFT
Input
<typename PointT> return p.intensity;
PointNormal return p.curvature;
PointXYZRGB return (static_cast<float> (299*p.r + 587*p.g + 114*p.b) / 1000.0f);
PointXYZRGBA return (static_cast<float> (299*p.r + 587*p.g + 114*p.b) / 1000.0f);
Can be customized to use other types/fields (example)
Output
PointWithScale (save scale info if the
scale
field exists)PointXYZ (otherwise just provide the points)
Notes
This method does not populate the keypoints indices --> there is no getKeypointsIndices()
Algorithm
Similar to the 2D SIFT algorithm, it performs local minimum or maximum extraction in scale space for each octave (i.e. voxels of doublings of resolution), and performs the difference of Gaussian operation between each octave. If the local max/min meets the minimum contrast requirement, take it as a key point. (IMHO, it is kind of complicated, and not sure if it still makes sense in 3D space.)
Harris3D
Input
PointXYZ
PointXYZRGB
Output
PointXYZI (
intensity
field required)
Notes
Need to set the threshold for intensity response for better performance
the function setThreshold();
Algorithm
It computes intensity response for each and every point in the input cloud, according to five different rules (Harris, Noble, Lowe, Tomasi, Curvature), and performs non-max suppression to select those salient ones (also checks if intensity > threshold). Therefore, it is necessary to set the threshold at this step for better performance.
Feature
Normal Estimation
template <typename PointInT, typename PointOutT>
Input
PointXYZ
PointXYZRGBNormal
Output
Normal
PointNormal
PointXYZRGBNormal
Notes
estimates local surface properties (surface normals and curvatures) at each 3D point.
If PointOutT is specified as pcl::Normal, the normal is stored in the first 3 components (0-2), and the curvature is stored in component 3.
RadiusSearch and KSearch cannot be used at the same time --> pick only one approach
Algorithm
The algorithm calls
computeCovarianceMatrix
function in centroid.h to compute normalized covariance matrix centered at its actual centroid/mean of all neighbors (not the query point).Then it performs eigenvalue decomposition on this covariance matrix and extracts the smallest eigenvalue and its eigenvector, and takes this eigenvector as the normal vector.
The curvature is computed by abs(smallest eigenvalue / trace of covariance matrix).
The covariance matrix is the second-order central mixed moment (二阶混合中心距).
For a plane, the estimated normal could have two opposite directions. The algorithm in PCL takes into consideration the view point of the point cloud and flips the estimated normal if cos(viewpoint - point, estimated normal) < 0. (cf. the method used in SHOT descriptor: check which half plane contains more points)
FPFH
template <typename PointInT, typename PointNT, typename PointOutT = pcl::FPFHSignature33>
Input
PointXYZ/PointXYZRGB + PointNormal/Normal
PointXYZRGBNormal + PointXYZRGBNormal
Output
FPFHSignature33
Notes
The radius used here has to be larger than the radius used to estimate the surface normals!
Registration
setMaxCorrespondenceDistance()
Set the maximum distance threshold between two correspondent points in source <-> target.
If the distance is larger than this threshold, the points will be ignored in the alignment process.
ICP
template <typename PointSource, typename PointTarget, typename Scalar = float>
The classic ICP registration algorithm using SVD (i.e. transformationEstimationSVD) is a wrap-up of the Eigen algorithm Eigen::umeyama.
SAC-IA
setMinSampleDistance()
Set the minimum distances between samples.
Select s sample points from P while making sure that their pairwise distances are greater than a user-defined minimum distance dmin. (from Rusu FPFH ICRA2009 paper)
NDT
This algorithm runs slow?
There is an issue in the computation of covariance in the NDT source code. This issue has not been fixed until PCL 1.12.0. The correct computation should multiply the term
n/(n-1)
but the code was incorrectly multiplying(n-1)/n
.
Last updated