点云配准:使用 ICP 算法进行雕像模型对齐
#include "vtkAutoInit.h"\nVTK_MODULE_INIT(vtkRenderingOpenGL);\nVTK_MODULE_INIT(vtkInteractionStyle);\n#define BOOST_TYPEOF_EMULATION\n#include "iostream"\n#include "pcl/io/pcd_io.h"\n#include "pcl/point_types.h"\n#include "pcl/registration/icp.h"\n#include "pcl/filters/voxel_grid.h"\n#include "pcl/visualization/pcl_visualizer.h"\n\nint main(int argc, char** argv)\n{\n pcl::PointCloudpcl::PointXYZ::Ptr cloud_in(new pcl::PointCloudpcl::PointXYZ);\n pcl::PointCloudpcl::PointXYZ::Ptr cloud_out(new pcl::PointCloudpcl::PointXYZ);\n\n pcl::io::loadPCDFilepcl::PointXYZ("D:\点云文件\雕像1.pcd", *cloud_in);\n pcl::io::loadPCDFilepcl::PointXYZ("D:\点云文件\雕像2.pcd", *cloud_out);\n\n pcl::VoxelGridpcl::PointXYZ voxel_grid;\n voxel_grid.setInputCloud(cloud_in);\n voxel_grid.setLeafSize(0.01f, 0.01f, 0.01f);\n pcl::PointCloudpcl::PointXYZ::Ptr cloud_in_downsampled(new pcl::PointCloudpcl::PointXYZ);\n voxel_grid.filter(*cloud_in_downsampled);\n\n voxel_grid.setInputCloud(cloud_out);\n pcl::PointCloudpcl::PointXYZ::Ptr cloud_out_downsampled(new pcl::PointCloudpcl::PointXYZ);\n voxel_grid.filter(*cloud_out_downsampled);\n\n Eigen::Matrix4f init_transform = Eigen::Matrix4f::Identity();\n init_transform(0, 3) = 0.1;\n\n pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp;\n icp.setInputCloud(cloud_in_downsampled);\n icp.setInputTarget(cloud_out_downsampled);\n icp.setMaxCorrespondenceDistance(0.1); // Increase the maximum correspondence distance\n icp.setTransformationEpsilon(1e-8);\n icp.setMaximumIterations(100);\n icp.setRANSACOutlierRejectionThreshold(0.05);\n icp.align(*cloud_in_downsampled, init_transform);\n\n std::cout << "has converged: " << icp.hasConverged() << " score: " << icp.getFitnessScore() << std::endl;\n std::cout << icp.getFinalTransformation() << std::endl;\n\n pcl::visualization::PCLVisualizer viewer("ICP Registration");\n viewer.addPointCloud(cloud_in_downsampled, pcl::visualization::PointCloudColorHandlerCustompcl::PointXYZ(cloud_in_downsampled, 255, 0, 0), "cloud_in");\n viewer.addPointCloud(cloud_out_downsampled, pcl::visualization::PointCloudColorHandlerCustompcl::PointXYZ(cloud_out_downsampled, 0, 255, 0), "cloud_out");\n viewer.addPointCloudpcl::PointXYZ(cloud_in, pcl::visualization::PointCloudColorHandlerCustompcl::PointXYZ(cloud_in, 255, 0, 0), "cloud_in_original");\n viewer.addPointCloudpcl::PointXYZ(cloud_in_downsampled, pcl::visualization::PointCloudColorHandlerCustompcl::PointXYZ(cloud_in_downsampled, 0, 0, 255), "cloud_aligned");\n viewer.spin();\n\n pcl::io::savePCDFile("D:\DIANYUNWENJIANJIA\icp_pcd.pcd", *cloud_in_downsampled);\n\n return 0;\n}
原文地址: https://www.cveoy.top/t/topic/pviD 著作权归作者所有。请勿转载和采集!