PCL学习笔记——利用点云配准CorrespondenceEstimationBase()函数找出两部分点云重叠区域

主要类:

pcl::registration::CorrespondenceEstimation< PointSource, PointTarget, Scalar > Class Template Reference

主要函数:

template<typename PointSource , typename PointTarget , typename Scalar = float>

virtual void pcl::registration::CorrespondenceEstimationBase< PointSource, PointTarget, Scalar >::determineReciprocalCorrespondences (pcl::Correspondences & correspondences,double max_distance = std::numeric_limits< double >::max() )
Parameters:

[out] correspondences:the found correspondences (index of query and target point, distance)
[in] max_distance:maximum allowed distance between correspondences (对应点最大距离)

确定输入和目标点云之间的相互对应关系

code:
// correspondence_points_registraction.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<pcl/registration/correspondence_estimation.h>
#include<pcl/io/pcd_io.h>
#include<pcl/kdtree/io.h>
#include<vector>
#include<fstream>

using namespace std;

int main()
{
	ofstream oa, ob;
	oa.open("overlap_a.txt");
	ob.open("overlap_b.txt");
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloudA(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloudB(new pcl::PointCloud<pcl::PointXYZ>);

	//读取PCD点云文件
	pcl::io::loadPCDFile<pcl::PointXYZ>("pointA.pcd", *cloudA);
	pcl::io::loadPCDFile<pcl::PointXYZ>("pointB.pcd", *cloudB);

	pcl::registration::CorrespondenceEstimation<pcl::PointXYZ, pcl::PointXYZ>core;
	core.setInputSource(cloudA);
	core.setInputTarget(cloudB);
	
	boost::shared_ptr<pcl::Correspondences> cor(new pcl::Correspondences);   //共享所有权的智能指针,以kdtree做索引

	core.determineReciprocalCorrespondences(*cor, 0.25);   //点之间的最大距离,cor对应索引

	//构造重叠点云的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写入txt文件
		oa << cloudA->points[cor->at(i).index_query].x<<" "<< cloudA->points[cor->at(i).index_query].y<<" "      //cor->at(i).index_query]对应点的索引
			<< cloudA->points[cor->at(i).index_query].z<<endl;
		
		//overlapA写入pcd文件
		overlapA.points[i].x = cloudA->points[cor->at(i).index_query].x;
		overlapA.points[i].y = cloudA->points[cor->at(i).index_query].y;
		overlapA.points[i].z = cloudA->points[cor->at(i).index_query].z;

		//overlapB写入txt文件
		ob << cloudB->points[cor->at(i).index_match].x << " " << cloudB->points[cor->at(i).index_match].y<<" "
			<< cloudB->points[cor->at(i).index_match].z << endl;

		//overlapB写入pcd文件
		overlapB.points[i].x = cloudB->points[cor->at(i).index_match].x;
		overlapB.points[i].y = cloudB->points[cor->at(i).index_match].y;
		overlapB.points[i].z = cloudB->points[cor->at(i).index_match].z;
	}
	//存储pcd文件
	pcl::io::savePCDFileASCII("overlapA.pcd", overlapA);
	pcl::io::savePCDFileASCII("overlapB.pcd", overlapB);

	oa, ob.close();
    return 0;
}
//2'04
results:

点云A重叠点
点云B重叠点
放大图

  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值