1. pcd文件
PCD:point cloud data点云数据文件格式(三维点坐标)。
参考:https://blog.csdn.net/qq_22170875/article/details/84785261
// 实现功能:两幅点云icp配准
//(PCL库文件中)pcd文件的读和写操作
#include <iostream>
using namespace std;
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/registration/icp.h> //ICP(iterative closest point)配准
#include <pcl/filters/voxel_grid.h>//体素滤波
using namespace pcl;
int main() {
typedef PointXYZ PointT;
typedef PointCloud<PointT> pointCloud;
pointCloud::Ptr cloud1(new pointCloud), cloud2(new pointCloud), cloud3(new pointCloud), cloud4(new pointCloud), cloud5(new pointCloud), cloud6(new pointCloud);
PCLPointCloud2::Ptr pcloud(new PCLPointCloud2), pcloud1(new PCLPointCloud2);
//读pcd文件
PCDReader reader;
reader.read("D:\\visual studio learning\\test_pointcloudmatch\\12滤.pcd", *cloud1);
reader.read("D:\\visual studio learning\\test_pointcloudmatch\\34滤.pcd", *cloud2);
IterativeClosestPoint<PointT, PointT> icp; //创建ICP对象,用于ICP配准
icp.setInputSource(cloud1); //设置输入点云
icp.setInputTarget(cloud2); //设置目标点云(输入点云进行仿射变换,得到目标点云)
//icp 参数设置
icp.setMaximumIterations(100); //最大迭代次数
icp.setEuclideanFitnessEpsilon(0.01);//设置收敛条件是均方误差和小于阈值,停止迭代
icp.setTransformationEpsilon(1e-10); //设置两次变化矩阵之间的差值;
//icp.setMaxCorrespondenceDistance(0.7); //设置对应点对之间的最大距离;对配准影响较大
//保存配准后的点
icp.align(*cloud3);
//icp匹配后的转换矩阵及得分
cout << "has converged: " << icp.hasConverged() << endl
<< "score: " << icp.getFitnessScore() << endl
<< "迭代次数:"<<icp.nr_iterations_ << endl;
cout << icp.getFinalTransformation() << endl;//icp.hasConverged()=1说明本次配准成功;icp.getFinalTransformation()可输出变换矩阵;icp.nr_iterations_显示迭代的次数; icp.getFitnessScore() 两幅点云拟合(配准)程度的好坏
//写pcd文件
PCDWriter writer;
writer.write("D:\\visual studio learning\\test_pointcloudmatch\\12粗配准.pcd", *cloud3);
IterativeClosestPoint<PointT, PointT> icp1; //创建ICP对象,用于ICP配准
icp1.setInputSource(cloud3); //设置输入点云
icp1.setInputTarget(cloud2); //设置目标点云(输入点云进行仿射变换,得到目标点云)
//icp 参数设置
icp1.setMaximumIterations(100); //最大迭代次数
icp1.setEuclideanFitnessEpsilon(0.001);//前后两次迭代误差的差值
icp1.setTransformationEpsilon(1e-12); //上次转换与当前转换的差值;
icp1.setMaxCorrespondenceDistance(20); //忽略在此距离之外的点,对配准影响较大
//保存配准后的点
icp1.align(*cloud4);
//icp匹配后的转换矩阵及得分
cout << "has converged: " << icp1.hasConverged() << endl
<< "score: " << icp1.getFitnessScore() << endl
<< "迭代次数:" << icp1.nr_iterations_ << endl;
cout << icp1.getFinalTransformation() << endl;
writer.write("D:\\visual studio learning\\test_pointcloudmatch\\12精粗配准.pcd", *cloud4);
IterativeClosestPoint<PointT, PointT> icp2; //创建ICP对象,用于ICP配准
icp2.setInputSource(cloud4); //设置输入点云
icp2.setInputTarget(cloud2); //设置目标点云(输入点云进行仿射变换,得到目标点云)
//icp 参数设置
icp2.setMaximumIterations(100); //最大迭代次数
icp2.setEuclideanFitnessEpsilon(0.0001);//前后两次迭代误差的差值
icp2.setTransformationEpsilon(1e-14); //上次转换与当前转换的差值;
icp2.setMaxCorrespondenceDistance(5); //忽略在此距离之外的点,对配准影响较大
//保存配准后的点
icp2.align(*cloud5);
//icp匹配后的转换矩阵及得分
cout << "has converged: " << icp2.hasConverged() << endl
<< "score: " << icp2.getFitnessScore() << endl
<< "迭代次数:" << icp2.nr_iterations_ << endl;
cou