PCL學習筆記——利用點雲配準CorrespondenceEstimationBase()函式找出兩部分點雲重疊區域
阿新 • • 發佈:2019-01-26
主要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:
採用點雲配準中的函式重疊點已經得到了!第一階段任務完成了