1. 程式人生 > >PCL學習筆記——利用點雲配準CorrespondenceEstimationBase()函式找出兩部分點雲重疊區域

PCL學習筆記——利用點雲配準CorrespondenceEstimationBase()函式找出兩部分點雲重疊區域

主要Classes:

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重疊點
放大圖
採用點雲配準中的函式重疊點已經得到了!第一階段任務完成了