原理:
pcl::correspondences类里面有query和match两个成员,分别是source和target点云上对应点对的索引。可以通过source[query]来访问source中的对应点;source[query].x,source[query].y,source[query].z来访问匹配点对中source对应点的x,y,z坐标。
代码实现
#include<pcl/io/pcd_io.h>
#include<pcl/kdtree/io.h>
#include<pcl/registration/correspondence_estimation.h>
using namespace std;
int main()
{
pcl::PointCloud<pcl::PointXYZ>::Ptr source(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr target(new pcl::PointCloud<pcl::PointXYZ>);
//读取点云文件
pcl::io::loadPCDFile<pcl::PointXYZ>("A3 - Cloud.pcd", *source);
pcl::io::loadPCDFile<pcl::PointXYZ>("B3 - Cloud.pcd", *target);
pcl::registration::CorrespondenceEstimation<pcl::PointXYZ, pcl::PointXYZ>core;
core.setInputSource(source);
core.setInputTarget(target);
boost::shared_ptr<pcl::Correspondences> cor(new pcl::Correspondences); //共享所有权的智能指针,以kdtree做索引
core.determineReciprocalCorrespondences(*cor, 0.10); //点之间的最大距离,cor对应索引
//输出第一个匹配点对中对应点的坐标
cout << "源点云中对应点坐标:" << source->points[cor->at(1).index_query] << endl;
cout << "目标点云中对应点坐标:" << target->points[cor->at(1).index_match] << endl;
//构造重叠点云的PCD格式文件
pcl::PointCloud<pcl::PointXYZ>overlapA;
pcl::PointCloud<pcl::PointXYZ>overlapB;
overlapA.width = cor->size();
overlapA.height = 1;
overlapA.is_dense = false;
overlapA.points.resize(overlapA.width*overlapA.height);
overlapB.width = cor->size();
overlapB.height = 1;
overlapB.is_dense = false;
overlapB.points.resize(overlapB.width*overlapB.height);
for (size_t i = 0; i < cor->size(); i++) {
//overlapA写入pcd文件
overlapA.points[i].x = source->points[cor->at(i).index_query].x;
overlapA.points[i].y = source->points[cor->at(i).index_query].y;
overlapA.points[i].z = source->points[cor->at(i).index_query].z;
//overlapB写入pcd文件
overlapB.points[i].x = target->points[cor->at(i).index_match].x;
overlapB.points[i].y = target->points[cor->at(i).index_match].y;
overlapB.points[i].z = target->points[cor->at(i).index_match].z;
}
//存储重叠部分到pcd文件
pcl::io::savePCDFileASCII("overlapA.pcd", overlapA);
pcl::io::savePCDFileASCII("overlapB.pcd", overlapB);
return 0;
}