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

主要类:

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

主要函数:

template

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
#include
#include
#include
#include

using namespace std;

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

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

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

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

	//构造重叠点云的PCD格式文件
	pcl::PointCloudoverlapA;
	pcl::PointCloudoverlapB;

	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<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:

PCL学习笔记——利用点云配准CorrespondenceEstimationBase()函数找出两部分点云重叠区域_第1张图片
PCL学习笔记——利用点云配准CorrespondenceEstimationBase()函数找出两部分点云重叠区域_第2张图片
PCL学习笔记——利用点云配准CorrespondenceEstimationBase()函数找出两部分点云重叠区域_第3张图片

你可能感兴趣的:(PCL学习,PCL学习笔记,PCL)