主要类:
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: