PCL 提取点云重叠部分并保存

原理:

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;
}

实验结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_36686437/article/details/105886110