Point Cloud Library (PCL) 1.12.0
Loading...
Searching...
No Matches
registration.h
1#pragma once
2
3#include "typedefs.h"
4
5#include <pcl/registration/ia_ransac.h>
6#include <pcl/registration/icp.h>
7
8/* Use SampleConsensusInitialAlignment to find a rough alignment from the source cloud to the target cloud by finding
9 * correspondences between two sets of local features
10 * Inputs:
11 * source_points
12 * The "source" points, i.e., the points that must be transformed to align with the target point cloud
13 * source_descriptors
14 * The local descriptors for each source point
15 * target_points
16 * The "target" points, i.e., the points to which the source point cloud will be aligned
17 * target_descriptors
18 * The local descriptors for each target point
19 * min_sample_distance
20 * The minimum distance between any two random samples
21 * max_correspondence_distance
22 * The
23 * nr_iterations
24 * The number of RANSAC iterations to perform
25 * Return: A transformation matrix that will roughly align the points in source to the points in target
26 */
27Eigen::Matrix4f
28computeInitialAlignment (const PointCloudPtr & source_points, const LocalDescriptorsPtr & source_descriptors,
29 const PointCloudPtr & target_points, const LocalDescriptorsPtr & target_descriptors,
30 float min_sample_distance, float max_correspondence_distance, int nr_iterations)
31{
33 sac_ia.setMinSampleDistance (min_sample_distance);
34 sac_ia.setMaxCorrespondenceDistance (max_correspondence_distance);
35 sac_ia.setMaximumIterations (nr_iterations);
36
37 sac_ia.setInputSource (source_points);
38 sac_ia.setSourceFeatures (source_descriptors);
39
40 sac_ia.setInputTarget (target_points);
41 sac_ia.setTargetFeatures (target_descriptors);
42
43 PointCloud registration_output;
44 sac_ia.align (registration_output);
45
46 return (sac_ia.getFinalTransformation ());
47}
48
49/* Use IterativeClosestPoint to find a precise alignment from the source cloud to the target cloud,
50 * starting with an initial guess
51 * Inputs:
52 * source_points
53 * The "source" points, i.e., the points that must be transformed to align with the target point cloud
54 * target_points
55 * The "target" points, i.e., the points to which the source point cloud will be aligned
56 * initial_alignment
57 * An initial estimate of the transformation matrix that aligns the source points to the target points
58 * max_correspondence_distance
59 * A threshold on the distance between any two corresponding points. Any corresponding points that are further
60 * apart than this threshold will be ignored when computing the source-to-target transformation
61 * outlier_rejection_threshold
62 * A threshold used to define outliers during RANSAC outlier rejection
63 * transformation_epsilon
64 * The smallest iterative transformation allowed before the algorithm is considered to have converged
65 * max_iterations
66 * The maximum number of ICP iterations to perform
67 * Return: A transformation matrix that will precisely align the points in source to the points in target
68 */
69Eigen::Matrix4f
70refineAlignment (const PointCloudPtr & source_points, const PointCloudPtr & target_points,
71 const Eigen::Matrix4f &initial_alignment, float max_correspondence_distance,
72 float outlier_rejection_threshold, float transformation_epsilon, float max_iterations)
73{
74
76 icp.setMaxCorrespondenceDistance (max_correspondence_distance);
77 icp.setRANSACOutlierRejectionThreshold (outlier_rejection_threshold);
78 icp.setTransformationEpsilon (transformation_epsilon);
79 icp.setMaximumIterations (max_iterations);
80
81 PointCloudPtr source_points_transformed (new PointCloud);
82 pcl::transformPointCloud (*source_points, *source_points_transformed, initial_alignment);
83
84 icp.setInputSource (source_points_transformed);
85 icp.setInputTarget (target_points);
86
87 PointCloud registration_output;
88 icp.align (registration_output);
89
90 return (icp.getFinalTransformation () * initial_alignment);
91}
Iterator class for point clouds with or without given indices.
PointCloud represents the base class in PCL for storing collections of 3D points.
void transformPointCloud(const pcl::PointCloud< PointT > &cloud_in, pcl::PointCloud< PointT > &cloud_out, const Eigen::Matrix< Scalar, 4, 4 > &transform, bool copy_all_fields)
Apply a rigid transform defined by a 4x4 matrix.