int main() {

// Load point clouds
PointCloud<PointXYZ>::Ptr cloud1(new PointCloud<PointXYZ>);
PointCloud<PointXYZ>::Ptr cloud2(new PointCloud<PointXYZ>);
pcl::io::loadPCDFile("cloud1.pcd", *cloud1);
pcl::io::loadPCDFile("cloud2.pcd", *cloud2);

// Downsample point clouds
float leaf_size = 0.01;
VoxelGrid<PointXYZ> vg;
vg.setInputCloud(cloud1);
vg.setLeafSize(leaf_size, leaf_size, leaf_size);
PointCloud<PointXYZ>::Ptr cloud1_downsampled(new PointCloud<PointXYZ>);
vg.filter(*cloud1_downsampled);
vg.setInputCloud(cloud2);
vg.filter(*cloud2);

// Calculate normals
NormalEstimation<PointXYZ, Normal> ne;
ne.setInputCloud(cloud1_downsampled);
search::KdTree<PointXYZ>::Ptr tree(new search::KdTree<PointXYZ>);
ne.setSearchMethod(tree);
PointCloud<Normal>::Ptr cloud1_normals(new PointCloud<Normal>);
ne.setRadiusSearch(0.03);
ne.compute(*cloud1_normals);

ne.setInputCloud(cloud2);
ne.compute(*cloud2_normals);

// Calculate PFH features
PFHEstimation<PointXYZ, Normal, PFHSignature33> pfh;
pfh.setInputCloud(cloud1_downsampled);
pfh.setInputNormals(cloud1_normals);
pfh.setRadiusSearch(0.05);
PointCloud<PFHSignature33>::Ptr cloud1_features(new PointCloud<PFHSignature33>);
pfh.compute(*cloud1_features);

pfh.setInputCloud(cloud2);
pfh.setInputNormals(cloud2_normals);
pfh.compute(*cloud2_features);

// Align point clouds using Sample Consensus Initial Alignment
int max_sacia_iterations = 500;
double min_correspondence_dist = 0.01;
double max_correspondence_dist = 0.1;
SampleConsensusInitialAlignment<pcl::PointXYZ, pcl::PointXYZ, pcl::FPFHSignature33> sac_ia = align(cloud1_downsampled, cloud2, cloud1_features, cloud2_features, max_sacia_iterations, min_correspondence_dist, max_correspondence_dist);

// Get final transformation
Eigen::Matrix4f final_transformation = sac_ia.getFinalTransformation();

// Transform cloud2 to align with cloud1
PointCloud<PointXYZ>::Ptr aligned_cloud2(new PointCloud<PointXYZ>);
transformPointCloud(*cloud2, *aligned_cloud2, final_transformation);

// Visualize aligned point clouds
visualization::CloudViewer viewer("Aligned Point Clouds");
viewer.showCloud(cloud1);
viewer.showCloud(aligned_cloud2);
while (!viewer.wasStopped()) {}

return 0;

原文地址: https://www.cveoy.top/t/topic/hIFT 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录