Go to the documentation of this file.00001 #ifndef REGISTRATION_H
00002 #define REGISTRATION_H
00003
00004 #include "typedefs.h"
00005
00006 #include <pcl/registration/ia_ransac.h>
00007 #include <pcl/registration/icp.h>
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 Eigen::Matrix4f
00029 computeInitialAlignment (const PointCloudPtr & source_points, const LocalDescriptorsPtr & source_descriptors,
00030 const PointCloudPtr & target_points, const LocalDescriptorsPtr & target_descriptors,
00031 float min_sample_distance, float max_correspondence_distance, int nr_iterations)
00032 {
00033 pcl::SampleConsensusInitialAlignment<PointT, PointT, LocalDescriptorT> sac_ia;
00034 sac_ia.setMinSampleDistance (min_sample_distance);
00035 sac_ia.setMaxCorrespondenceDistance (max_correspondence_distance);
00036 sac_ia.setMaximumIterations (nr_iterations);
00037
00038 sac_ia.setInputCloud (source_points);
00039 sac_ia.setSourceFeatures (source_descriptors);
00040
00041 sac_ia.setInputTarget (target_points);
00042 sac_ia.setTargetFeatures (target_descriptors);
00043
00044 PointCloud registration_output;
00045 sac_ia.align (registration_output);
00046
00047 return (sac_ia.getFinalTransformation ());
00048 }
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070 Eigen::Matrix4f
00071 refineAlignment (const PointCloudPtr & source_points, const PointCloudPtr & target_points,
00072 const Eigen::Matrix4f &initial_alignment, float max_correspondence_distance,
00073 float outlier_rejection_threshold, float transformation_epsilon, float max_iterations)
00074 {
00075
00076 pcl::IterativeClosestPoint<PointT, PointT> icp;
00077 icp.setMaxCorrespondenceDistance (max_correspondence_distance);
00078 icp.setRANSACOutlierRejectionThreshold (outlier_rejection_threshold);
00079 icp.setTransformationEpsilon (transformation_epsilon);
00080 icp.setMaximumIterations (max_iterations);
00081
00082 PointCloudPtr source_points_transformed (new PointCloud);
00083 pcl::transformPointCloud (*source_points, *source_points_transformed, initial_alignment);
00084
00085 icp.setInputCloud (source_points_transformed);
00086 icp.setInputTarget (target_points);
00087
00088 PointCloud registration_output;
00089 icp.align (registration_output);
00090
00091 return (icp.getFinalTransformation () * initial_alignment);
00092 }
00093
00094 #endif